put()
,clear()
およびremove()
は、ConcurrentHashMap
によって提供され、ロックを使用せずにスレッドセーフな操作です。ConcurrentHashMap remove()スレッドBを使用して反復処理中にスレッド
ConcurrentHashMap
には、異なるセグメントがあり、各セグメントにはいくつかのハッシュバケットがあります。 clear()
がちょうどそのバケットが、ハッシュチェーンのハッシュチェーンへの参照をクリアするため
Clear()
とput()
はスレッドががそれを反復されている場合、それが影響を受けたが、clear()
からされることはありませんので、まだそこにあるスレッドセーフですスレッドB。 Put()
は、そのバケットのハッシュチェーンの先頭に常に新しいノードを配置するので、それも問題ありません。
しかし、私が理解していないのは、なぜremove()
がスレッドセーフなのでしょうか?例えば、ハッシュバケットはバケット→A→B→C→D→EとスレッドAはremove(C)
となり、ConcurrentHashMap
の実装で提供されるメカニズムはA、Bを次のリンクされたリストが逆順でバケット→B-> A-> DEとなり、A.nextを元のD-> Eとすると、バケット→B→A→DEとなります。
これはスレッドセーフなのはなぜですか?現在、thread B
が要素Aを反復処理していて、次にthread A
がremove(C)を呼び出すとどうなりますか?それは壊れるように見えますか?
どのような「壊れた」と言っていますか? –