[英]Java Synchronized block
在参考的同步块中更新参考是否有效? 例如:
Synchronized(list)
{
list = new ArrayList();
}
当你写
synchronized (list)
锁是一个对象 ,而不是变量/字段list
。
如果你这样做
synchronized (list) {
list = new ArrayList<>();
}
您正在创建一个新对象,然后重新分配一个变量/字段-但您尚未更改锁-锁仍然是以前的对象。
是的,它是完全有效的,但是这样做会带来什么呢? 此外, 线程获得对象实例的锁定,而不是持有对象引用的变量的锁定,因此即使您用其他实例重新分配list
,当前线程也已经锁定了上一个对象。
为了进一步说明,假设为list
分配了值val1
。 然后, thread1
锁定val1
(由变量list
指向),现在即使thread1
重新实例化了list
,其他线程也无法锁定val1
(因为它们正在等待实例val1
不在参考list
上的锁定)。
最好是清除synchronized
块中的list
而不是重新初始化它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.