[英]What does segmentMask mean in java ConcurrentHashMap
我觉得
(hash >>> segmentShift) & segmentMask
等于
(hash >>> segmentShift)
例如,ssize 是 16,sshift 是 4,所以 segmentShift 是 28,segmentMask 是 15
hash >>> segmentShift
将获得高 4 位,当使用 segmentMask 执行和操作时,没有任何改变。
我有什么误解?
好吧,我从这里了解到的是整个操作
(hash >>> segmentShift) & segmentMask
用于查找表中段的位置。 正如您已经提到的, (hash >>> segmentShift) 用于获取密钥哈希的前 4 位。
但段掩码的主要工作是在段表数组中平均分配段。 ConcurrentHashMap 中有很多段,所以为了避免冲突,使用了这个段掩码。 并且段掩码是[(2的幂)-1]。
这个概念类似于 HashMap,其中 [hash & (length_of_hashmap-1)] 用于在 hashmap 中查找键的索引。
hashmap 的长度总是 2 的幂,在这种情况下,segmentmask 也是(2 的幂)-1。
它适用于 hashmap%size of 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 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.