検索

ホームページ  >  に質問  >  本文

java - ConcurrentHashMap的get为什么可以不加锁?

ringa_leeringa_lee2807日前840

全員に返信(5)返信します

  • 阿神

    阿神2017-04-18 10:08:21

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

      リーリー

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

    返事
    0
  • 阿神

    阿神2017-04-18 10:08:21

    1. get ロックする必要はありません。読み取りだけではデータは変更されません

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

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

    リーリー

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

    返事
    0
  • 黄舟

    黄舟2017-04-18 10:08:21

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

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:08:21

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

    返事
    0
  • PHPz

    PHPz2017-04-18 10:08:21

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

    返事
    0
  • キャンセル返事