Java 同步块

Java Synchronized block

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

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

当你写

synchronized (list)

锁是一个 对象 ,而不是 variable/field list

如果你这样做

synchronized (list) {
    list = new ArrayList<>();
}

您正在创建一个新对象,并重新分配一个 variable/field - 但您没有更改锁 - 锁仍然是之前的对象。

是的,它是完全有效的,但是您这样做会达到什么目的?此外,线程获得对象实例的锁,而不是持有对象引用的变量,因此即使您将 list 重新分配给其他实例,当前线程已经锁定了前一个对象.

为了更清楚地说明,假设 list 被分配了值 val1。然后 thread1 锁定 val1(由变量 list 指向),现在其他线程无法锁定 val1(因为它们正在等待锁定实例 val1 不在参考 list 上)即使 thread1 已重新实例化 list.

最好是清除 synchronized 块中的 list 而不是重新初始化它。