我在一本書中讀到說,由於編譯器優化,代碼執行可能會被重新排序,導致ReaderThread無限循環。這怎麼可能?Java多線程可見性?
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;
}
}
你試過運行上面的代碼嗎?當我使用JRE-8 – AADProgramming
@AADTechnical在Eclipse中運行它時,它並沒有進入無限循環 - 這沒有任何證據。底線是JLS *允許*代碼導致無限循環。看到我的答案。 –
@AADTechnical是的,我用5個ReaderThreads在我的臺式電腦上運行,它們完美地執行(打印42)。但這取決於編譯器設置和CPU我想。這是「Java併發實踐」一書中的一個例子。 – sonnywang