同期アクションを含まず、単純なインスタンス変数の読み取りと書き込みのみを行う単純なシングルスレッド Java プログラムの実行を考えてみましょう。すべての書き込みを単純に無視する実装は、Java メモリ仕様に準拠しているようです。まず、§17.4からの該当する一般的なステートメント:
メモリ モデルは、プログラムの各ポイントで読み取ることができる値を決定します。分離された各スレッドのアクションは、そのスレッドのセマンティクスによって管理されるように動作する必要があります。
関連する制約は次のとおりです ( §17.4.5 )。
1. プログラムの順序によって引き起こされる事前発生順序付け:
x と y が同じスレッドのアクションであり、プログラムの順序で x が y の前にある場合、hb(x, y) になります。
2. 先行発生の一貫性:
アクションのセット A は、A 内のすべての読み取り r について、w(r) が r によって見られる書き込みアクションである場合、事前発生整合性があります。hb(r, W(r)) またはwv = rv および hb(W(r), w) および hb(w, r) となる書き込み w が A に存在します。
これは基本的に、監視する書き込みの前に読み取りが発生するのを防ぎます。もう 1 つの規定は、一部の読み取りが、その間に行われたv
以前の書き込みの後に同じ.v
v
書き込みが確実に観察されるという保証はまったくありません。書き込みの制限が観察されない可能性があるだけです。
ここで何が欠けていますか?JVM がそのような些細な保証を除外する可能性は本当にあるのでしょうか?