我现在正在阅读 Java 语言规范。
在此执行中,读取会看到执行顺序后面发生的写入。这可能看起来违反直觉,但在发生之前的一致性允许。允许读取看到稍后的写入有时会产生不可接受的行为。
尽管有时不希望允许读取看到执行顺序后面的写入,但有时也是必要的。
17.4.8-1 也给出了一个奇怪的例子。
为什么可以reads see writes come later
?
如果真的有可能,我怎样才能在java代码中重现它?
编辑
这不是重复的问题。那个问题刚刚问了 17.4.5-1,我可以理解 17.4.5-1 因为编译器可能会重新排序它们。但是 17.4.8-1 呢?它在Executions and Causality Requirements
. 根据 的定义execution order
,没有人可以重新排序
r1 = x; // write
和
if (r1 != 0) // read
所以这y = 1
必须发生在最后。