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;
}
}
「Java Concurrency in Practice」によると、適切な同期を使用しないため、数値への書き込みまたはプログラムがまったく終了しない前に、準備完了への書き込みがリーダースレッドに表示される可能性があるため、0 が出力される可能性があります。メイン スレッドによって書き込まれた ready および number の値がリーダー スレッドに表示されることは保証されていません。
それはどのように可能ですか?プログラムはスレッドによって順次実行され、最初に number に書き込み、次に ready 変数に書き込みます。ではない?そして、このプログラムはどのようにして永遠にループすることができるのでしょうか?