我正在阅读《Java 并发实践》,到目前为止,它非常有趣
我遇到过 list 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。
所以我很好奇,我应该尝试运行多少次(统计上)直到看到失败的示例,为什么失败如此罕见? 我尝试过搜索,但我发现的是:question about “Java Concurrency in Practice” example但这与我的问题无关,因为我确实了解它是如何发生的,但只是好奇为什么执行失败如此困难
谢谢:)
最佳答案
重新排序可以在 JIT 级别或 CPU 级别完成。您的代码太短,JIT 无法启动,因此必须是 CPU。
对于如此简单的操作,CPU 确实没有理由开始搞乱您的代码,因此您可能永远不会观察到重新排序,并且您的程序将始终打印 42。
该示例的要点并不是说它将会损坏,而是理论上它可能损坏。
关于Java 并发实践 list 3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28003965/