我有一个关于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 by中的顺序是什么?
发布于 2017-02-17 15:13:24
让我们首先通过注释掉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是允许的结果。
https://stackoverflow.com/questions/38546897
复制相似问题