25

最近の講演で、volatile への書き込みは、スレッドが書き込みを行った変数ごとにメモリ バリアをトリガーするという話を聞きました。それは本当に正しいですか?JLS からは、関連する変数のみがフラッシュされ、他の変数はフラッシュされないようです。実際に何が正しいのか誰か知っていますか?JLSの具体的な場所を教えてもらえますか?

4

2 に答える 2

28

はい、バリアを開始します。詳しくはこちらをご覧ください。LoadLoad LoadStore StoreStore StoreLoadの4種類があります。

ご質問の限りでは

JLS から、関連する変数のみがフラッシュされ、他の変数はフラッシュされないようです。実際に何が正しいのか誰か知っていますか?

揮発性ストアの前に発生するすべての書き込みは、他のスレッドがこの新しいストアをロードするという述語を使用して、他のスレッドから参照できます。ただし、揮発性ロードの前に発生する書き込みは、新しい値をロードしない場合、他のスレッドによって認識される場合と認識されない場合があります。

実際の例として

volatile int a =0;
int b = 0;

Thread-1
b = 10;
a = 3;

Thread-2
if(a == 0){
  // b can b 10 or 0
} 
if(a == 3){
   // b is guaranteed to be 10 (according to the JMM)
}
于 2012-12-03T17:45:19.130 に答える
3

Volatile 変数およびその他の変数への参照は正しいものでした。事前発生の推移性は、VM によって実装されなければならないものであり、定義に従うものではないことに気づきませんでした。これほど広範囲に及ぶ結果を伴う何かが明確に述べられていないのに、実際には何らかの定義からの当然の帰結である理由に、私はまだ困惑しています。まとめ: 次のような 4 つのアクションがあるとします。

thread1        thread2
a1
a2
                a3
                a4

ここで、a2 は揮発性変数 v への書き込みであり、a3 は同じ揮発性変数 v からの読み取りです。hb(a1,a2) と hb(a3,a4) は、先行発生 (hb) の定義から導き出されます。また、揮発性には hb(a2,a3) があります。hb の必要な推移性から、hb(a1,a3) が得られます。したがって、揮発性変数 v の書き込みとその後の読み取りは、メモリ バリアとして機能します。

于 2012-12-04T07:48:33.830 に答える