[英]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.