【发布时间】:2015-07-26 13:57:24
【问题描述】:
我想澄清 happens-before 关系如何与 volatile 变量一起工作。让我们有以下变量:
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 -
v = 2happens-beforevDst = v在 JMM 中,前提是它实际上发生在时间之前 -
i = 1之前发生iDst = i在 JMM 中(并且iDst将被分配1)如果v = 2实际发生在vDst = v之前 -
i = 1和iDst = i之间的其他顺序未定义,iDst的结果值也未定义
逻辑错误:
JMM 中没有“挂钟时间”的概念,我们应该依赖同步顺序作为v = 2 和vDst = v 的订购指南。有关详细信息,请参阅所选答案。
【问题讨论】:
-
没有什么可以添加到@manouti 答案中,但是如果您需要,这个问题会为您提供另一个示例:stackoverflow.com/questions/17108541/…
标签: java volatile thread-synchronization java-memory-model happens-before