1

我从 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;
}
4

0 回答 0