朱ディスク:
私はからそれを読んで、実際にJavaの並行処理には同期せずにスレッドで共有変数に悪いことを、。しかし、一つだけの読み取りスレッドと1つの書き込みスレッドを持って次のようにいくつかの例のために、私はそれでエラーを見つけることができません。私の観点から、以下のプログラムの結果は間違いなく終了し、準備が真になった場合にのみReaderThreadが通過することができますので、42を印刷し、その手段の数は、私が間違っている理由42.誰かが私にいくつかの説明を与えることができるであるだろうか?
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
ではないvolatile
、保証はありませんReaderThread
、あなたのメインスレッドがそれを変更されていることがわかります。あなたがマークするとready
揮発性として、一つのスレッドからのすべての書き込みは、それを読んで、他のスレッドで見られます。
あなたは常に、スレッド間で通信する場合の同期/可視性制御のいくつかの並べ替えを必要とします。それはだかどうかはvolatile
明示的に使用し、synchronized
または使用するjava.util.concurrent.*
クラスを。