本「Java Concurrency in Practice」で次の例に出くわしました。
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;
}
}
さらに次のように述べられています。
ready の値がリーダー スレッドに表示されない可能性があるため、NoVisibility は永久にループする可能性があります。さらに奇妙なことに、NoVisibility はゼロを出力する可能性があります。これは、ready への書き込みが number への書き込みの前にリーダー スレッドに表示される可能性があるためです。これは、並べ替えと呼ばれる現象です。
並べ替えの問題は理解できますが、可視性の問題は理解できません。の値がready
リーダースレッドに表示されないのはなぜですか? メイン スレッドが に値を書き込むとready
、遅かれ早かれリーダー スレッドが実行され、 の値を読み取ることができますready
。メインスレッドによって行われた変更がready
リーダースレッドに表示されないのはなぜですか?