スレッドの上級Javaクラスの私の先生は、私にはわからないことを言っていました。
彼は、以下のコードは必ずしもready
変数を更新するとは限らないと述べた。彼によると、特に各スレッド(メインスレッドとReaderThread
)が独自のプロセッサで実行されているため、2つのスレッドが必ずしも静的変数を共有していないため、同じレジスタ/キャッシュ/ etcと1つのCPUを共有していない他を更新しません。
基本的ready
に、メインスレッドで更新される可能性はありますが、では更新されない可能性があるReaderThread
ため、ReaderThread
無限にループします。
彼はまた、プログラムが0
またはを印刷することは可能であると主張した42
。どの42
ように印刷できるか理解していますが、できません0
。彼number
は、変数がデフォルト値に設定されている場合にこれが当てはまるだろうと述べました。
静的変数がスレッド間で更新されることが保証されていないのではないかと思ったのですが、これはJavaにとって非常に奇妙な印象を受けます。ready
揮発性にすることでこの問題は修正されますか?
彼はこのコードを示しました:
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;
}
}