5

ConcurrentHashMapin Java は、更新と同時に続行する読み取りを提供します。これのトレードオフは、読み取りの結果が、読み取りが開始されたときに最後に完了した更新のみを反映するように制限されているため、要素の最新の状態を反映するように指定されていないことです。

ただし、AFAIK Java Memory Model では、読み取りスレッドと書き込みスレッド間の何らかの形式の同期がないと、書き込みスレッドの更新が、任意の時間が経過しても読み取りスレッドに表示されない場合があります。

読み取りスレッドが書き込みスレッドでブロックされない場合、最後に完了した更新の可視性を読み取りスレッドが利用できることを保証する根拠は何ですか?

実行中のコンペア アンド スワップ アルゴリズムの行で何かを考えることができましたが、そのライブラリのソース コードでそれを確認することはできませんでした。

4

1 に答える 1

6

値の読み取りは、実際には揮発性ロードです。ノンブロッキングですが、ストアも揮発性であるため、事前発生の関係が保証されます。

Java 5、6、7 のバージョンの CHM は、CAS を使用して参照を交換しません。しかし、いくつかの書き込みで使用する新しい軽量バージョンが開発中です。

于 2011-10-27T14:03:01.080 に答える