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
而不是重新初始化它。
在引用的同步块中更新引用是否有效? 例如:
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
而不是重新初始化它。