3

JLSで言われています:

2 つのアクションは、先行発生関係によって順序付けできます。あるアクションが別のアクションの前に発生する場合、最初のアクションは 2 番目のアクションよりも前に表示され、順序付けされます。

また、次のようにも言われています。

たとえば、別のスレッドの読み取りとデータ競合している 1 つのスレッドの書き込みは、それらの読み取りに対して順不同で発生するように見える場合があります。

hb(r, w)これは、 if , thenrが より前でなければならないw、またはが前である場合 、事前発生関係が発生することを意味しますrか?

4

1 に答える 1

6

hb(r, w)は、 ANDが の結果を確認できるr前に実行されることを意味します。wwr

読み取り/書き込みアクションの場合、一般的にhb(w, r)、読み取りが書き込みの結果を確認できるようにする必要があります。

同期ブロックを使用した例:

ブロックw(書き込み):

synchronized (lock) { //lock is a final object
    aVariable = something;
}

ブロックr(読み取り):

synchronized (lock) { //the same final object
    System.out.println(aVariable)
}

wrは同じモニターで同期されるため、2 つの間に発生前の関係があります。

wが の前に実行されたとしましょうr。つまり、 がある場合、JMMは が の最新の値を出力することをhb(w, r)保証します。raVariable

同期されたブロックがないと、事前発生の関係がなくなり、(ウォール クロックの観点から)w前に実行されたとしても、 の古い値が出力される可能性があります。rraVariable

事前発生の関係がなければ、プログラムがそうであってはならない方法で記述されていても (つまり、JVM が操作の順序を変更した可能性があります)、w後で実行される場合さえあるかもしれません。r

事前発生関係なしで奇妙なことがどのように発生するかの非常に良い例が、JLS - 例 17.4-1に示されています。

于 2012-07-13T11:20:49.123 に答える