实践中的Java并发清单3.1

时间:2015-01-17 20:27:13

标签: java multithreading concurrency

我在实践中阅读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但我的问题无关紧要,因为我了解它是如何发生但只是好奇的为什么执行失败如此困难

谢谢:)

1 个答案:

答案 0 :(得分:2)

可以在JIT级别或CPU级别进行重新排序。你的代码太短,JIT无法启动,所以它必须是CPU。

对于这样一个简单的操作,没有理由说CPU会开始弄乱你的代码,所以你可能永远不会观察到重新排序,你的程序将始终打印42。

该示例的要点并不是说它中断,但理论上

另请参阅:Why this broken program always runs?