我有一个关于 JMM 的问题。我知道什么是“之前发生”,但我不明白一件事。有一段代码:
private static int x = 0;
private static volatile boolean flag = false;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
x = 10;
while (!flag) ;
System.out.println(x);
}).start();
x = 5;
flag = true;
}
“X”中必须包含什么值,是否有规则来确定它? 也许在这种情况下,线程是否有某种顺序将某些值放入 X 中?
最佳答案
我们首先通过注释掉 x=10 来稍微简化一下程序。
private static int x = 0;
private static volatile boolean flag = false;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
//x = 10;
while (!flag) ;
System.out.println(x);
}).start();
x = 5;
flag = true;
}
在此示例中,将打印 5。为什么?
x=5
|
[program order rule]
|
flag=true
|
[volatile variable rule]
|
tmp1=flag
|
[program order rule]
|
tmp2=x
因为发生在规则之前也是可传递的,所以 x=5 和 tmp2=x 之间存在发生在关系之前。
如果 x=10 未注释,则 10 和 5 是允许的结果。
关于java - JMM 和发生之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546897/