java - ConcurrentHashMap的get为什么可以不加锁?
ringa_lee
ringa_lee 2017-04-18 10:06:21
0
5
837
ringa_lee
ringa_lee

ringa_lee

全員に返信(5)
阿神
  1. 内部実装ではロックが使用されるため、使用時に別のロック層を追加する必要はありません

    リーリー

    2/3. 書き込みが完了していない状態で読み込むとnullが読み込まれます。書き込み操作によりロックが解除されるのを待ってから再度読み込みます。

いいねを押す +0
阿神
  1. get ロックする必要はありません。読み取りだけではデータは変更されません

  2. readValueUnderLock 通常の条件は実行されません

  3. e.valuenull には使用されません。 著者 Doug Lea は次のように説明しています

リーリー

jdk の上位バージョンでは、ConncurrentHashMap が完全に書き直され、コードのこの部分は削除されています。

いいねを押す +0
黄舟

ConncurrentHashMap は jdk5 によって導入されました。独自の操作によりスレッドの安全性が保証されるため、ロックする必要はありません

いいねを押す +0
Peter_Zhu

古典的な読み取りおよび書き込みモデル。通常、読み取りにはロックは必要ありません

いいねを押す +0
PHPzhong

Get 操作では、基になる配列やリンク リストは変更されません。元の投稿者の質問は、Get 中に別のスレッドが同時に put するか、Get 中に別のスレッドが同時に削除するというものかもしれません。実際、ここで問題はありません。 get が前にあり、put が後ろにある場合、get の後に Remove が前にある場合も null が返されます。最初に置くと null が得られ、最初に削除すると obj が得られるという状況は発生しません。 Remove または put の最終操作はアトミックな設定であるため、get 操作がこの操作を混乱させる可能性はありません

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート