JMM和之前发生的事情

时间:2016-07-23 22:17:09

标签: java

我对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中?

1 个答案:

答案 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是允许的结果。