hb(r, w)
は、 ANDが の結果を確認できるr
前に実行されることを意味します。w
w
r
読み取り/書き込みアクションの場合、一般的にhb(w, r)
、読み取りが書き込みの結果を確認できるようにする必要があります。
同期ブロックを使用した例:
ブロックw
(書き込み):
synchronized (lock) { //lock is a final object
aVariable = something;
}
ブロックr
(読み取り):
synchronized (lock) { //the same final object
System.out.println(aVariable)
}
w
とr
は同じモニターで同期されるため、2 つの間に発生前の関係があります。
w
が の前に実行されたとしましょうr
。つまり、 がある場合、JMMは が の最新の値を出力することをhb(w, r)
保証します。r
aVariable
同期されたブロックがないと、事前発生の関係がなくなり、(ウォール クロックの観点から)w
前に実行されたとしても、 の古い値が出力される可能性があります。r
r
aVariable
事前発生の関係がなければ、プログラムがそうであってはならない方法で記述されていても (つまり、JVM が操作の順序を変更した可能性があります)、w
後で実行される場合さえあるかもしれません。r
事前発生関係なしで奇妙なことがどのように発生するかの非常に良い例が、JLS - 例 17.4-1に示されています。