【发布时间】:2019-10-10 09:16:32
【问题描述】:
private Object x = new Object();
public void doA() {
synchronized(x){
x = new Object();
//do something
}
}
public void doB() {
synchronized(x) {
//do something
}
}
假设doA() 和doB() 被同时调用,但doA() 首先进行。所以 B 将被阻止直到 doA() 完成
即使doA() 修改了x = new x 调用中的x,这是真的吗?或者在doA() 中的x = new x 这行之后doB() 将不再被阻止,因为x 已更改?
【问题讨论】:
-
您始终可以尝试在本地计算机上运行此实验,可能使用长时间的睡眠和打印语句,以便您可以看到事情发生得足够慢,以便于理解。
-
锁定在原始参考上。为什么会改变?
-
@yegodm 有道理
-
x到底是什么?一类?一个领域? (构造函数?) -
无论如何,
//do something影响的状态最终不再由同一个锁保护,因此不存在有效的 happens-before 关系.
标签: java multithreading