Java的锁分为对象锁和类锁。

  1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

  2. 然而,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

  3. 尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对该object中所有其它synchronized(this)同步代码块的访问将被阻塞。

  4. 同步加锁的是对象,而不是代码。因此,如果你的类中有一个同步方法,这个方法可以被两个不同的线程同时执行,只要每个线程自己创建一个的该类的实例即可。

  5. 不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。

  6. synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。

  7.对一个全局对象或者类加锁时,对该类的所有对象都起作用。

类锁举例

对一个全局变量加锁:

 1 public class MySynchronized extends Thread2 {3     private int val;4     5     private static Object lock = new Object();6     7     public MySynchronized(int v)8     {9         val = v;
10     }
11
12     public void printVal(int v)
13     {
14         synchronized (lock)
15         {
16             while (true)
17             {
18                 System.out.println(v);
19             }
20         }
21     }
22
23     public void run()
24     {
25         printVal(val);
26     }
27 }

  对整个类加锁:

1 public class MySynchronized extends Thread2 {3     private int val;4     5     public MySynchronized(int v)6     {7         val = v;8     }9
10     public void printVal(int v)
11     {
12         synchronized (MySynchronized.class)
13         {
14             while (true)
15             {
16                 System.out.println(v);
17             }
18         }
19     }
20
21     public void run()
22     {
23         printVal(val);
24     }
25 }

另外的锁例子:

String常量的特殊性,属于同一个对象。

public class MySynchronized extends Thread
{private String name;private String val;public MySynchronized(String name, String v){this.name = name;val = v;}public void printVal(){synchronized (val){while (true){System.out.println(name + val);}}}public void run(){printVal();}public static void main(String args[]){MySynchronized f1 = new MySynchronized("Foo 1:", "printVal");f1.start();MySynchronized f2 = new MySynchronized("Foo 2:", "printVal");f2.start();}
}

  

总结:synchronized作用于静态方法和非静态方法的区别: 

/* *  非静态方法: *  给对象加锁(可以理解为给这个对象的内存上锁,注意 只是这块内存,其他同类对象都会有各自的内存锁),这时候 * 在其他一个以上线程中执行该对象的这个同步方法(注意:是该对象)就会产生互斥 *  静态方法:  * 相当于在类上加锁(*.class 位于代码区,静态方法位于静态区域,这个类产生的对象公用这个静态方法,所以这块 * 内存,N个对象来竞争), 这时候,只要是这个类产生的对象,在调用这个静态方法时都会产生互斥 */

  

  

  

  

转载于:https://www.cnblogs.com/cangqiongbingchen/p/5806757.html

Java锁Synchronized,对象锁和类锁举例相关推荐

  1. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  2. Java锁Synchronized对象锁和类锁区别(搬运)

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  3. 类锁 synchronized对象锁 和 Lock对象锁

    在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制. 对象锁 所有对象都自动含有单一的锁. JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数变为0.在任务(线程)第一次给对象加锁的时候 ...

  4. 可重入锁-synchronized是可重入锁吗?

    目录 前言 1.什么是可重入锁呢? 2.自己写代码验证下可重入和不可重入 3.自己如何实现一个可重入和不可重入锁呢 4.ReentrantLock如何实现可重入的 5.可重入锁的特点 前言 面试题:s ...

  5. JAVA获取Class对象及其Class类中的常用方法

    反射: 反射是我们 经常用到的一个知识点,那什么是反射呢? 反射就是在程序运行过程中分析类的一种能力 在这里我们想一下我们在编写java的时候,先写java源文件-->字节码文件(class文件 ...

  6. 最接地气的通俗易懂理解java中类和对象(什么是类,什么是对象)

    类和对象(什么是类,什么是对象) 以通俗易懂.说人话的方式理解类和对象以及如何创建对象(实例化) 在以下中,标红的字体就是类,标蓝的字体就是对象! 我问大家几个问题: 1.你最喜欢的娱乐明星是哪些? ...

  7. java 字节码对象_获得类的字节码对象的三种方式

    java源码(xxx.java)通过编译后形成字节码文件,字节码文件通过类加载器获得字节码对象, 通过字节码对象可以操作源码中的属性和方法. 方式一,使用类的class属性: Class clazz1 ...

  8. 对java中匿名对象和匿名类的简单理解

    首先在写完这篇博客时感谢几位作者的文章: https://www.cnblogs.com/txbblog/p/10364558.html https://blog.csdn.net/chengqium ...

  9. java switch enum对象_Java枚举类(enum)5种常见用法和3种内部方法,详细附代码

    文章目录 Java枚举类(enum)重点用法和内部方法,附代码 一.Java 枚举类(enum) 详解5种常见的用法 1.常量 2.支持switch 3.向枚举中添加新方法 4.覆盖枚举的方法 5.实 ...

  10. java基础类与对象_Java基础---类与对象

    类创建原则 一个类只承担一个功能,只有一条public class语句,但是可以有多条class 对象实例化 我们知道类是抽象的,对象是实际的,比如猫类我们可以写为public class Cat,而 ...

最新文章

  1. MongoDB操作命令
  2. PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决
  3. 如何在Django中以GROUP BY查询?
  4. bzoj1684[Usaco2005 Oct]Close Encounter*
  5. fotify php审计,代码安全审计(二)Fortify介绍及使用教程
  6. graal java_使用SparkJava和Graal的本机微服务
  7. OpenJudge NOI 1.7 17:字符串判等
  8. 【Elasticsearch】如何使用 Elasticsearch 6.2 搜索中文、日语和韩语文本 - 第 3 部分:语言检测工具
  9. 使用minikube在windows构建kubernetes群集
  10. 配置rsync同步+inotify实时监控
  11. 基于java springboot android安卓商城购物平台源码(毕设)
  12. 王佩丰 Excel 24节课 学习笔记
  13. Revit模型如何在网页上显示
  14. OCR文字识别软件在线如何操作?
  15. 二、概率p值检验例题(R语言)
  16. 开发游戏十年,遭遇游戏开发史上最诡异事件,然而被我成功解决了!
  17. 分散式云存储,元宇宙数据存储基建
  18. Struts2远程命令执行漏洞
  19. WWW 2022最佳论文出炉!北京大学团队获唯一最佳学生论文奖
  20. 二维码相机遮罩层快速实现

热门文章

  1. 生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
  2. Android自定义View【实战教程】4⃣️----BitmapShader详解及圆形、圆角、多边形实现
  3. 面试官常问的线程池,你真的了解吗?
  4. _Linux中删除特殊名称文件的多种方式
  5. js 不相等 多次随机数_node.js静态\动态服务器
  6. 国内python镜像源记录
  7. layui分页完整实例php,使用 layui 后端分页的实例
  8. python手机安装不了软件怎么办_安装python安装方法
  9. Selenium爬虫 -- Pyhton进阶:使用cookie登陆某网站
  10. ASP.NET CORE MVC 2.0 发布到IIS 配置问题