繁体   English   中英

Java同步块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM