gpt4 book ai didi

java - JMM 和发生之前

转载 作者:太空宇宙 更新时间:2023-11-04 12:24:02 26 4
gpt4 key购买 nike

我有一个关于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com