我对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中?
答案 0 :(得分:0)
让我们首先通过注释掉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是允许的结果。