【发布时间】:2020-05-25 03:02:45
【问题描述】:
这可能以前已经回答过,但由于问题的复杂性,我需要确认一下。所以我改写这个问题
问题1:当一个线程进入一个同步块时,内存屏障将包括所有触及的字段,而不仅仅是我同步对象的字段?因此,如果在一个同步块中修改了许多对象,那么就会在线程内存缓存之间移动大量内存。
Thread 1
object.field1 = "";
synchronized (lock) {
farAwayObject.field1 = "";
farAwayObject.evenFarther.field2 = "";
}
Thread 2. assuming thread ordering is correct
synchronized (lock) {
//thread 2 guaranteed to see all fields above as ""
//even object.field1 ?
}
问题 2:线程 1 中的 object.field1 = ""; 是否隐含地属于发生前关系?
我希望是,但可能不是。如果没有,是否有一个技巧可以在不将其放入同步块的情况下做到这一点?否则很难对程序进行推理 并且将所有内容都放在同步的 { } 下是不切实际的。
编辑:澄清:object.field1 不是易失性的,问题是“线程 2 是否会保证至少看到线程 1 的写入”。我的问题是关于内存可见性。为了论证,假设只有线程 1 写入非易失性 object.field1。
问题 2 可以改写为
“锁上的同步块是否会将之前所做的更改推送给其他线程在同一锁上同步?”
【问题讨论】:
-
这两个问题的答案都是肯定的。
-
@shmosel 我了解到
object.field1不会成为happens-before 的一部分,Thread2可能会或可能不会看到更新?
标签: java multithreading java-memory-model