本を読むと、次のコードが表示されます。
public class Test {
private static boolean ready = false;
private static int number = 0;
public static class ListenerThread extends Thread {
public void run() {
while(!ready) {
Thread.yield();
}
System.out.println(number);
}
}
public static void main (String[] args) {
new ListenerThread().start();
number = 10;
ready = true;
}
}
私が驚いた主なポイントは、著者によって比較的迅速に言及されました。
彼らは、ListenerThreadが決して終了しないかもしれないと言いました。私はこれについて数日間(頭の後ろで)考えました、そして私の唯一の結論はそれがそのListenerThreadによってキャッシュされるかもしれないということです。本当?
ready
volatileを作成すると、問題は解決しますか(キャッシュする必要がなくなったため)?また、プログラムが0を出力する可能性があるとも述べています。Javaが命令を並べ替える可能性があることを理解したので、番号が変更される前に別のスレッドに対してreadyがtrueになります。それらの命令を同期ブロックに配置する以外に、(中央ロック値で)問題を解決する方法(手法)はありますか?私はおそらくnotify()/ wait()を実装することを考えていましたが、同じ結果になると思います。問題を回避するための最良の方法は何ですか?
ありがとうございました!
編集:
たくさんのコードを読んだだけで、複数のスレッドでの並べ替えから保護するのに苦労した人はほとんどいません。これはどのくらい一般的ですか?