私は、コンパイラの最適化のためにコード実行を並べ替えることで、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;
}
}
上記のコードを実行しようとしましたか?私はEclipseでJRE-8を実行したときに無限ループに入っていません。 – AADProgramming
@AADTechnical - それは何も証明しません。要点は、JLS *がそのコードに無限ループを許すことです。私の答えを見てください。 –
@AADTechnicalはいデスクトップPCで5つのReaderThreadsを実行したところ、完全に実行されました(印刷42)。しかし、それはコンパイラの設定と私が推測するCPUに依存します。これは、「Java Concurrency in Action」の例です。 – sonnywang