gpt4 book ai didi

java - 为什么没有 'volatile' 的程序运行为 'volatile' ?

转载 作者:行者123 更新时间:2023-11-30 01:45:11 25 4
gpt4 key购买 nike

如下所示,该程序有一个共享 var flag,但不带 volatile :

public class T {
public static void main(String[] args) {
TT jump = new TT(() -> {
while (true) {
if (TT.flag) {
System.out.println("jump");
break;
}
}
});
jump.start();
new TT(() -> {
TT.flag = true; // P1
LocalDateTime t1 = LocalDateTime.now();
while (true) {
if (Duration.between(t1, LocalDateTime.now()).toMillis() > 100) {
break;
}
}
System.out.println("flag");
}).start();

}

static class TT extends Thread {
public static boolean flag = false;
public TT(Runnable o) {
super(o);
}
}
}

程序总是正常返回。所以我相信 P1 行,其中 flag 设置为 true,在其他线程中更新了 flag

但是为什么呢? flag不是 volatile 的,为什么它的值会立即更新?永远!

最佳答案

But why? flag is not volatile, why its value was updated immediately? Always!

你只是幸运;或不幸,取决于你的观点。我在 Ideone 上尝试了这个,发现它超时而​​不是正常终止。

请记住:无法观察到并发错误并不等同于不存在并发错误。

当您能够根据规范证明代码不存在错误时,您对代码最有把握。这并不意味着代码就能正常工作;而是意味着代码可以正常工作。这只是意味着问题出在 JVM 实现中。

特别是,您无法证明此代码将正常工作,因为在第二个线程中写入 flag 之间不存在 happens-before 关系,以及第一个线程中的读取。添加 volatile 创建了这种保证,因为 volatile 写入发生在 volatile 读取之前。

这并不是说如果没有 volatile,它将永远工作,只是不能保证:JVM 只需要至少按照规范要求的频率刷新线程的缓存值,但可以做得更多通常,或者实际上根本不缓存值。

关于java - 为什么没有 'volatile' 的程序运行为 'volatile' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58334417/

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