JMM 保证当线程 A 写入易失性变量 V 时,所有其他(非易失性)写入在线程 B 读取该 V 值后变得可见。
在存在多个易失性 V 覆盖具有相同值的情况下,该保证是否成立?
即考虑以下代码:
int x = 0;
int y = 0;
volatile int v = 0;
void fromThreadA() {
x = 1;
v = 0;
y = 1;
v = 0; // note that both writes to v never actually change its value
}
void fromThreadB() {
while(v == 0) {
if (x == 1 && y == 1) break;
}
}
是否可以保证
fromThreadB
的调用者最终会终止?
这与是否“写入易失性变量 V...变得可见”无关。这都是关于“以前发生过的事情”。
线程 A 中对
x
和 y
的赋值都“发生在”第二次对 v
的赋值之前,因为所有这些赋值都发生在同一个线程中,并且同一线程中发生的事情总是按程序顺序发生.
同时,线程 B 从
v
读取。线程 A 中对 v
的赋值“发生在”线程 B 中的读取之前,因为 JMM 是这么说的。因此,一旦线程 A 调用了 fromThreadA()
函数,那么下一次线程 B 循环时,它必须看到 x==1
和 y==1
。