同一个类中,有两个方法都用 synchronized 修饰,这两个方法线程安全吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同一个类中,有两个方法都用 synchronized 修饰,这两个方法线程安全吗?相关的知识,希望对你有一定的参考价值。

如果A,B都是实例方法(AB均用synchronized修饰),且A,B方法中都操作了类的同一个属性,那么这样会发生线程不安全吗?

参考技术A 那得看你这两个方法是怎么定义的,有方法A,B ,A是实例方法,B是静态方法,前者你加上synchronized关键字的话那么你同步的实际上只是调用这个方法的对象而已,这样子的话无论怎么都不会发生线程安全的问题,除非在同一时间内多次调用这个对象多次,方法B你加上synchronized关键字的话意味着你把这个静态方法所在的类给同步了,这样子的话如果多个地方在同一时间段内要调用这个方法的话必定产生同步效果,因为在整个虚拟机内,这个类的二进制编码只有一份,在多线程中,它就是所谓的临界资源了,大家都想用它,但是又不想发生莫名其妙的数据错误,那么我肯定得同步了。而对于方法A,我前面说了,如果同一时间内多次调用这个对象的话,那么这个对象实际上就是临界资源,很多人想用,那你就排队,也只有这个时候才会发生同步效果
你A,B方法内都涉及到对同一个属性的操作的话,那么为了避免死锁,你可以用synchronized关键字配合wait(),notify()方法一起使用,如果逻辑关系处理正确的话你仍然可以让数据按照你的想象流程进行,对于初学者,逻辑控制是比较麻烦,我刚学这儿的时候也是总会出现逻辑上的错误导致程序出现死循环。
参考技术B 很遗憾,synchronized即使修饰了,还是会产生线程的不安全。
理论上,只要有两个线程和两个对象的使用不当就会引起“死锁”问题。具体我就不说了。
关键字就是“死锁”。
java没有处理死锁的机制,你的小心设计程序才行。
建议阅读Oreilly的java thread,通过设计避免死锁的发生。本回答被提问者和网友采纳

对象锁和class锁

  • 对象锁:就是这个锁属于这个类的对象实例,可以通过为类中的非静态方法加synchronized关键字 或者使用 synchronized(this) 代码块,为程序加对象锁。
  • Class锁:就是这个锁属于这个Class类,所以即使是不同的实例对象仍然拥有的是同一个锁,可以通过为类中的静态方法加synchronized关键字 或者使用 synchronized(*.Class) 代码块,为程序加Class锁。

  Class锁和对象锁是属于不同的锁,属于异步执行,存在争抢作用。
  Class锁对当前的*.java文件对应的Class类进行持锁,对这个类的所有实例对象起作用。而对象锁只对自己的实例对象起作用。

以上是关于同一个类中,有两个方法都用 synchronized 修饰,这两个方法线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

对象及变量的并发访问-----synchronized同步----- 锁可重入

初学Java多线程:使用Synchronized块同步方法

对象锁和class锁

Java中synchronized和Lock的区别

synchronized 加在java方法前面是啥作用

synchronized的使用方法