静的変数はスレッド間で共有されていますか?
-
30-10-2019 - |
質問
スレッドの上位レベルのJavaクラスの先生は、私が確信していないことを言った。
彼は、次のコードが必ずしも更新されるとは限らないと述べた ready
変数。彼によると、2つのスレッドは必ずしも静的変数を共有しているわけではありません。特に各スレッド(メインスレッド対メインスレッドの場合) ReaderThread
)独自のプロセッサで実行されているため、同じレジスタ/キャッシュ/などを共有せず、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;
}
}
正しい解決策はありません
所属していません StackOverflow