私はJCIPの例を試していましたが、以下のプログラムは機能しないはずですが、20回実行しても常に機能し、この場合でも表示されるようになっていready
ますnumber
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread implements Runnable {
public void run() {
while (!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors());
//Number of Processor is 4 so 4+1 threads
new Thread(new ReaderThread()).start();
new Thread(new ReaderThread()).start();
new Thread(new ReaderThread()).start();
new Thread(new ReaderThread()).start();
new Thread(new ReaderThread()).start();
number = 42;
ready = true;
}
}
私のマシンでは、常に印刷されます
4 -- Number of Processors
42
42
42
42
42
According to Listing 3.1 of JCIP It should sometimes print 0 or should never terminate it also suggest that there is no gaurantee that ready and number written by main thread will be visible to reader thread
更新 すべてのスレッドで同じ出力を実行した後、メイン スレッドに 1000 ミリ秒のスリープを追加しました。私はプログラムが壊れていることを知っており、そのように動作することを期待しています