更新该引用的同步块中的引用是否有效? 例如:
Synchronized(list)
{
list = new ArrayList();
}
答案 0 :(得分:5)
写作时
synchronized (list)
锁是对象,而不是变量/字段list
。
如果你这样做
synchronized (list) {
list = new ArrayList<>();
}
您正在创建一个新对象,并重新分配一个变量/字段 - 但您没有更改锁定 - 锁定仍然是之前的对象。
答案 1 :(得分:1)
是的,它完全有效,但是你通过这样做会得到什么?此外,线程获取对象实例上的锁定,而不是保存对象引用的变量,因此即使您将list
重新分配给其他实例,当前线程也已锁定前一个对象。
为了澄清更多内容,我们说list
已分配值val1
。然后thread1
锁定val1
(由变量list
指向),现在其他线程无法锁定val1
(因为他们正在等待即使val1
重新实例化list
,也要锁定实例thread1
而不是引用list
)。
最好清除list
块内的synchronized
,而不是重新初始化它。