适用于操作而非语句的Java内存模型

时间:2018-10-30 08:25:23

标签: multithreading volatile java-memory-model happens-before

我是从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),这也进一步破坏了推理。这是一个非常容易犯的错误,并且您必须记住,在操作(而不是语句)应用于操作之前(以及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;
}

0 个答案:

没有答案