我在实践中阅读Java并发性,到目前为止真的很有趣
我遇到了清单3.1,其中包含以下代码示例:
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
}
}
我理解这段代码片段在理论上会出错。
我决定自己检查一下,所以我把代码输入了我的IDE 并运行了大约40次,每次输出都相同:42。
所以我好奇,多少次(统计上)我应该尝试并运行它,直到我看到一个失败的例子,为什么失败如此罕见? 我已尝试搜索SO,但我发现的只有:question about “Java Concurrency in Practice” example但我的问题无关紧要,因为我做了解它是如何发生但只是好奇的为什么执行失败如此困难
谢谢:)
答案 0 :(得分:2)
可以在JIT级别或CPU级别进行重新排序。你的代码太短,JIT无法启动,所以它必须是CPU。
对于这样一个简单的操作,没有理由说CPU会开始弄乱你的代码,所以你可能永远不会观察到重新排序,你的程序将始终打印42。
该示例的要点并不是说它将中断,但理论上