Synchronized修饰非静态方法

Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。

Java中每个对象都有一个锁,并且是唯一的。假设分配的一个对象空间,里面有多个方法,相当于空间里面有多个小房间,如果我们把所有的小房间都加锁,因为这个对象只有一把钥匙,因此同一时间只能有一个人打开一个小房间,然后用完了还回去,再由JVM 去分配下一个获得钥匙的人。

情况1:同一个对象在两个线程中分别访问该对象的两个同步方法

结果:会产生互斥。

解释:因为锁针对的是对象,当对象调用一个synchronized方法时,其他同步方法需要等待其执行结束并释放锁后才能执行。正如上面所解释的,相当于一个对象只有一把钥匙了,里面的两个同步方法是两个房间,因此,同一时间只能用一个钥匙访问一个方法。

情况2:不同对象在两个线程中调用同一个同步方法

结果:不会产生互斥。

解释:因为是两个对象,就相当于两个大房子,彼此之间互不干扰,具有两把钥匙。锁针对的是对象,并不是方法,所以可以并发执行,不会互斥。形象的来说就是因为我们每个线程在调用方法的时候都是new 一个对象,那么就会出现两个空间,两把钥匙。

Synchronized修饰静态方法

Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。

情况1:用类直接在两个线程中调用两个不同的同步方法

结果:会产生互斥。

解释:因为对静态对象加锁实际上对类(.class)加锁,类对象只有一个,可以理解为任何时候都只有一个空间,里面有N个房间,一把锁,因此房间(同步方法)之间一定是互斥的。

注:上述情况和用单例模式声明一个对象来调用非静态方法的情况是一样的,因为永远就只有这一个对象。所以访问同步方法之间一定是互斥的。

情况2:用一个类的静态对象在两个线程中调用静态方法或非静态方法

结果:会产生互斥。

解释:因为是一个对象调用,同上。都调用静态方法的时候,相当于是同一个类锁,用的都是同一个类对象。

都调用非静态方法的时候,相当于是同一个对象锁。

情况3:一个对象在两个线程中分别调用一个静态同步方法和一个非静态同步方法

结果:不会产生互斥。

解释:因为虽然是一个对象调用,但是两个方法的锁类型不同,调用的静态方法实际上是类对象在调用,即这两个方法产生的并不是同一个对象锁,因此不会互斥,会并发执行。

例子

pulbic class Something(){public synchronized void isSyncA(){}public synchronized void isSyncB(){}public static synchronized void cSyncA(){}public static synchronized void cSyncB(){}}

那么,加入有Something类的两个实例a与b,那么下列哪组方法可以被1个以上线程同时访问呢?

a. x.isSyncA()与 x.isSyncB()b. x.isSyncA()与 y.isSyncA()c. x.cSyncA()与 y.cSyncB()d. x.isSyncA()与 Something.cSyncA()

这里,很清楚的可以判断:

a,都是对同一个实例的synchronized域访问,因此不能被同时访问

b,是针对不同实例的,因此可以同时被访问

c,因为是static synchronized,所以不同实例之间不会被限制

d,书上的答案是可以被同时访问的,答案理由是synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因。

java中synchronized修饰静态方法和非静态方法有什么区别?相关推荐

  1. 使用synchronized修饰静态方法和非静态方法有什么区别

    前言 最近被问到了这个问题,第一次回答的也是很不好,在此参考网上答案进行整理记录.供大家学习参考. Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法 ...

  2. java静态方法 问题_Java中堆、栈,静态方法和非静态方法的速度问题

    一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...

  3. java堆和客栈_JAVA中堆、栈,静态方法和非静态方法的速度问题

    一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...

  4. java中静态方法与非静态方法的区别及非静态方法的注意事项

    一旦使用static修饰成员方法,那么这就成为了静态方法.静态方法不属于对象,而是属于类的. 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它. 如果有了static关键字,那 ...

  5. Java中静态方法和非静态方法的区别是什么

    静态方法和非静态方法的区别总结如下: 1.静态方法属于类所有,类实例化前即可使用: 2.非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员: 3.因为静态方法在类实例化前就可以使用,而类 ...

  6. java中访问修饰符_Java中的非访问修饰符是什么?

    java中访问修饰符 Java非访问修饰符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name o ...

  7. java静态方法和非静态方法的区别_史上最全阿里 Java 面试题总结

    关注[ToBeTopJavaer],回复[答案],获取全套面试题答案,为明年的金三银四,做好充分的准备. JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗 ...

  8. 静态方法和非静态方法的区别JAVA

    最近在写JAVA程序的时候报了一个错. No enclosing instance of type FileRead is accessible. Must qualify the allocatio ...

  9. php中静态方法有什么作用,PHP中的静态方法与非静态方法有什么不同吗?

    除此之外,如果您尝试在您的方法中使用$this,如下所示: class t { protected $a = 10; public function tt() { echo $this->a; ...

最新文章

  1. Java-COW在Java中的应用
  2. uc/os-ii中最高优先级计算(如何查表)
  3. 实习随记-不定时更新
  4. PHP连接达梦数据库
  5. 疲劳容器的定义_材料疲劳
  6. Flutter游戏:垃圾里会生蚊子
  7. jsp servlet示例_Java Servlet Cookies示例
  8. JavaScript数字精度丢失的一些问题
  9. Vue 实现简单的时间轴 时间进度条
  10. 2022年中国云计算面临的问题及发展前景预测分析
  11. redis和zk实现分布式锁的优缺点
  12. 设计-由OOiNN设计师精心设计的每一个姓氏的印章
  13. 多个txt合并成一个txt(简单易操作)
  14. staruml的各类图
  15. 8人Python-----day02
  16. NUC972 使用不同的FLASH开机的ENV文件写法 NAND...
  17. eclipse 同时打开两个
  18. 数学建模模型2——多属性决策模型之加权算术平均算子【评价型】
  19. MySQL GIS功能介绍
  20. 成都夏季招聘会IT行业缺口大!

热门文章

  1. java数组随机排序_JAVA 生成随机数数组,并排序输出
  2. “裁员” + 滤镜 = “毕业”
  3. 好几天没戴工牌坐地铁了,受不了!
  4. 皮一皮:流散国外的珍宝。。。
  5. 深圳一普通中学老师工资单曝光,秒杀程序员,网友:真酸~
  6. 衡量计算机的平均无故障时间6,平均无故障时间MTBF测试及计算过程
  7. UML之类图和包图,对象图
  8. vs2019快捷键设置
  9. vs 编译android so
  10. CenterNet 读书笔记