【发布时间】:2019-10-11 04:49:18
【问题描述】:
如下所示,该程序有一个共享 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 不是易失性的,为什么它的值会立即更新?永远!
【问题讨论】:
-
"Always" 除非您在所有兼容的 JVM 上对此进行了测试,否则您不能做出这样的声明。您正在尝试的 JVM 可能恰好被实现,所以这 happens 是真的。
-
顺便说一句,it times out on Ideone
标签: java volatile non-volatile