と思います
(hash >>> segmentShift) & segmentMask
等しい
(hash >>> segmentShift)
たとえば、ssize は 16、sshift は 4 なので、segmentShift は 28、segmentMask は 15 です。
hash >>> segmentShift
セグメントマスクで操作を行うと、上位4ビットになりますが、何も変更されません。
私が誤解している点は何ですか?
と思います
(hash >>> segmentShift) & segmentMask
等しい
(hash >>> segmentShift)
たとえば、ssize は 16、sshift は 4 なので、segmentShift は 28、segmentMask は 15 です。
hash >>> segmentShift
セグメントマスクで操作を行うと、上位4ビットになりますが、何も変更されません。
私が誤解している点は何ですか?
さて、ここからわかることは、この操作全体が
(ハッシュ >>> セグメントシフト) & セグメントマスク
テーブル内のセグメントの位置を見つけるために使用されます。既に述べたように、 (hash >>> segmentShift) はキーのハッシュの上位 4 ビットを取得するために使用されます。
ただし、セグメント マスクの主な役割は、セグメント テーブル配列にセグメントを均等に分散することです。ConcurrentHashMap には多くのセグメントがあるため、衝突を避けるために、このセグメント マスクが使用されます。また、セグメントマスクは [(2 の累乗)-1] です。
この概念は、[hash & (length_of_hashmap-1)] を使用してハッシュマップ内のキーのインデックスを検索する HashMap に似ています。
hashmap の長さは常に 2 の累乗であり、この場合、segmentmask も (2 の累乗)-1 です。
ハッシュマップの hashmap%size と同じ概念で機能するため、インデックスは hahsmap の長さを超えません。