阿神2017-04-18 10:08:21
内部実装ではロックが使用されるため、使用時に別のロック層を追加する必要はありません
リーリー2/3. 書き込みが完了していない状態で読み込むとnullが読み込まれます。書き込み操作によりロックが解除されるのを待ってから再度読み込みます。
阿神2017-04-18 10:08:21
get
ロックする必要はありません。読み取りだけではデータは変更されません
readValueUnderLock
通常の条件は実行されません
e.value
は null
には使用されません。 著者 Doug Lea
は次のように説明しています
jdk の上位バージョンでは、ConncurrentHashMap
が完全に書き直され、コードのこの部分は削除されています。
黄舟2017-04-18 10:08:21
ConncurrentHashMap は jdk5 によって導入されました。独自の操作によりスレッドの安全性が保証されるため、ロックする必要はありません
PHPz2017-04-18 10:08:21
Get 操作では、基になる配列やリンク リストは変更されません。元の投稿者の質問は、Get 中に別のスレッドが同時に put するか、Get 中に別のスレッドが同時に削除するというものかもしれません。実際、ここで問題はありません。 get が前にあり、put が後ろにある場合、get の後に Remove が前にある場合も null が返されます。最初に置くと null が得られ、最初に削除すると obj が得られるという状況は発生しません。 Remove または put の最終操作はアトミックな設定であるため、get 操作がこの操作を混乱させる可能性はありません
。