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