ここで volatile/atomic/synchronized の使用を避けることができるかどうか疑問に思っているので質問します。
実際には、CPU キャッシュはおそらく定期的にメイン メモリに同期されます (頻度は多くのパラメーターに依存します)。
しかし、それは要点を欠いています。実際の問題は、適切な同期パターンを使用しない場合、コンパイラが自由にコードを「最適化」して更新部分を削除できることです。
例えば:
class Broken {
boolean stop = false;
void broken() throws Exception {
while (!stop) {
Thread.sleep(100);
}
}
}
コンパイラは、そのコードを次のように書き換えることが許可されています。
void broken() throws Exception {
while (true) {
Thread.sleep(100);
}
}
メソッドstop
の実行中に不揮発性が変更される可能性があるかどうかを確認する義務がないためです。変数を としてbroken
マークし、その最適化はこれ以上許可されません。stop
volatile
結論: 状態を共有する必要がある場合は、同期が必要です。