我觉得
(hash >>> segmentShift) & segmentMask
等于
(hash >>> segmentShift)
比如ssize是16,sshift是4,所以segmentShift是28,segmentMask是15
hash >>> segmentShift
将获得高 4 位,当使用 segmentMask 进行操作时,没有任何改变。
我有什么误解?
我觉得
(hash >>> segmentShift) & segmentMask
等于
(hash >>> segmentShift)
比如ssize是16,sshift是4,所以segmentShift是28,segmentMask是15
hash >>> segmentShift
将获得高 4 位,当使用 segmentMask 进行操作时,没有任何改变。
我有什么误解?
好吧,我从这里了解到的是,整个操作
(哈希 >>> 段移位)和段掩码
用于查找表中段的位置。正如您已经提到的, (hash >>> segmentShift) 用于获取密钥哈希的前 4 位。
但是段掩码的主要工作是在段表数组中平均分配段。ConcurrentHashMap 中有很多段,所以为了避免冲突,使用了这个段掩码。段掩码是 [(2 的幂)-1]。
这个概念类似于 HashMap,其中 [hash & (length_of_hashmap-1)] 用于在 hashmap 中查找键的索引。
hashmap 的长度始终是 2 的幂,在这种情况下,segmentmask 也是(2 的幂)-1。
它与 hashmap%size 的 hashmap 概念相同,因此索引不会超出 hahsmap 的长度。
完全正确!但有一个例外。
int sshift = 0;
int ssize = 1;
while (ssize < concurrencyLevel) {
++sshift;
ssize <<= 1;
}
segmentShift = 32 - sshift;
segmentMask = ssize - 1;
当 concurrentLevel 为 1 时,segmentShift 为 32,segmentMask 为 0。 (hash >>> 32) = hash ,方式越过段数组的限制,那么你需要 segmentMask 。