我从 A. Shipilev 的博客中得知,JMM 适用于动作而不是带有下面提到的代码和语句的语句
…他们说 g = 1 发生在 int lg = g 之前。通过逻辑上得出结论 int lx = x 将始终看到 x = 1(因为 x = 1 hb g = 1,并且 int lg = g hb int lx = x),这列火车进一步破坏了推理。这是一个非常容易犯的错误,您必须记住,happens-before(以及 JMM 形式主义中的其他顺序)适用于操作,而不是语句。
https://shipilev.net/blog/2016/close-encounters-of-jmm-kind/#pitfall-volatiles-wrong
我的印象是两者都是一样的。我是否缺少任何潜在的差异。
int x;
volatile int g;
void m() {
x = 1;
g = 1;
}
void r() {
int lg = g;
int lx = x;
}