我想澄清一下volatile变量如何与happens-before关系配合工作。让我们假设有以下变量:
public static int i, iDst, vDst;
public static volatile int v;
以及线程A:
i = 1;
v = 2;
和线程B:
vDst = v;
iDst = i;
以下语句是否符合Java内存模型(JMM)?如果不是,正确的解释应该是什么?
i = 1
总是在v = 2
之前发生(happens-before)。- 只有当
v = 2
实际上发生在时间上之前,v = 2
才会在JMM中发生在vDst = v
之前(happens-before)。 - 如果
v = 2
实际上发生在时间上之前, 那么i = 1
就会在JMM中发生在iDst = i
之前(happens-before),且iDst
将可预测地被赋值为1
。 - 否则,
i = 1
和iDst = i
之间的顺序是未定义的,iDst
的结果值也是未定义的。
逻辑错误:
JMM中没有“墙钟时间”的概念,我们应该依靠同步顺序作为v = 2
和vDst = v
的排序指南。详见所选答案。