6

アトミック アクセスに関する Oracle のドキュメント ( http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html ) には、次のように書かれています。

「揮発性変数は事前発生関係を確立します....これは、スレッドが揮発性変数を読み取るときに、揮発性変数への最新の変更だけでなく、原因となったコードの副作用も確認することを意味します変化。"

私はそれについて頭を包むのに苦労しています。揮発性変数がどのように機能するかは理解していますが (>= Java 5)、Java が揮発性変数の変更に「つながった」副作用をどのように決定するのか疑問に思っています。

だから私の質問は次のとおりだと思います:この保証にはどのような副作用がありますか?

編集:

したがって、スレッド A が揮発性変数を変更し、次にスレッド B がそれを読み取る場合、揮発性変数への書き込みの前に発生したスレッド A からのすべての書き込みは、スレッド B に関して「一貫性が保たれる」ことを学びました (つまり、キャッシュされた値スレッド A による前述の書き込みの対象となる変数の数は、スレッド B で無効化されます)。私が間違っている場合は修正してください。

4

2 に答える 2

5

ほとんどのマルチプロセッサ キャッシュにはコヒーレンシ メカニズムがあるため、ペナルティはすべてのキャッシュをフラッシュするほど悪くはありません。

その前に volatile に書き込んだスレッド内の書き込みは、書き込み後に volatile を読み取るスレッドによって認識されます。

于 2012-02-07T00:24:21.867 に答える
3

例として、ダブル チェック ロックを取り上げます。オブジェクトを作成すると、裏で多くのことが起こります。

MyClass c=new MyClass();

メモリが割り当てられ、コンストラクタが呼び出され、メモリ位置が変数 c に割り当てられます。JVM はこれらのアクションを並べ替えることができます。これにより、メモリが割り当てられ、値が割り当てられ、コンストラクタが呼び出される前にスレッドが割り込んで値を使用すると、問題が発生します。

volatile MyClass c=new MyClass();

1.5 ルールでは、割り当てはこれらのイベントの最後の 1 つであることが保証されています。「副作用」は、割り当てとコンストラクター呼び出しです。

于 2012-02-07T00:28:58.457 に答える