Java同步块

时间:2016-04-14 15:30:58

标签: java synchronization synchronized

更新该引用的同步块中的引用是否有效? 例如:

Synchronized(list)
{
  list = new ArrayList();
}

2 个答案:

答案 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,而不是重新初始化它。