簡體   English   中英

清單3.1中的Java並發實踐

[英]Java concurrency in practice Listing 3.1

我正在實踐中閱讀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上進行搜索,但發現的只是: 關於“ Java Concurrency in Practice”示例的問題,但這我的問題無關 ,因為我確實知道它如何發生的,但只是對為什么為什么如此難獲得失敗的執行感到好奇

謝謝 :)

可以在JIT級別或CPU級別進行重新排序。 您的代碼太短,無法啟動JIT,因此必須是CPU。

對於這樣一個簡單的操作,實際上沒有任何理由使CPU開始弄亂您的代碼,因此您可能永遠不會觀察到重新排序,並且程序將始終打印42。

該示例的目的不是要說它崩潰,而是在理論上崩潰。

另請參閱: 為什么這個壞程序總是運行?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM