黑马程序员技术交流社区
标题:
关于同步锁
[打印本页]
作者:
李方哲
时间:
2011-9-28 14:53
标题:
关于同步锁
假设我现在写了一个类,里面有两个方法,我要调用几个线程来执行它,
但是我需要加一个同步锁,如果方法A是静态方法,B是普通方法,
用
synchronized锁住这两个线程,是不是锁住A的时候B依然会被调用,这样是不是还是不安全。
作者:
匿名
时间:
2011-9-28 15:20
锁都有具体的对象,一个锁只能对应一个对象,如果两个所使用的不是同一个对象的话那么这个两个锁甲不是同一个锁。
作者:
匿名
时间:
2011-9-28 15:34
如果是直接在A和B方法中加synchronized,A和B使用的线程监视器对象(可以说是锁吧!)是不同的,线程执行时仍然是不安全的,静态方法使用的监视器对象是类的字节码,而普通方法使用的是this对象,它们使用的是不同的锁,当然不能实现同步了。
作者:
匿名
时间:
2011-9-28 22:49
两个方法只有使用的锁是同一个对象才能达到同步效果。
静态的同步方法,使用的锁是该方法所在类的字节码文件对象 类名.class
普通的同步方法,使用的锁是该类的实例对象this,
所以静态的同步方法和普通的同步方法使用的锁不是同一个对象,不能达到同步效果。
解决办法:
要想让两个方法同步,那么两个对象使用的锁就必须是同一个对象,让普通方法也使用 本类的字节码对象 类名.class 就可以达到同步效果了。
把普通方法改成
synchronized(本类名.class){
调用普通方法;
}
就解决问题了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2