我认为
(hash >>> segmentShift) & segmentMask
等于
(hash >>> segmentShift)
例如,ssize是16,sshift是4,所以segmentShift是28,segmentMask是15
hash >>> segmentShift
将获得高4位,何时做&使用segmentMask进行操作,没有任何改变。
我误解的重点是什么?
答案 0 :(得分:0)
嗯,我从这里理解的是整个操作
(hash>>> segmentShift)& segmentMask
用于在表中查找段的位置。正如您已经提到的那样(hash>>> segmentShift)用于获取密钥散列的前4位。
但是段掩码的主要工作是在段表数组中均匀分布段。 ConcurrentHashMap中有许多段,以避免冲突,使用此段掩码。 并且段掩码是[(2的幂)-1]。
这个概念类似于HashMap,其中[hash& (length_of_hashmap-1)]用于查找hashmap中的键索引。
hashmap的长度总是2的幂,在这种情况下,segmentmask也是(2的幂)-1。
它适用于hashmap的hashmap%size的相同概念,因此索引不会超出hahsmap的长度。
答案 1 :(得分:0)
完全正确!但是有一个例外。
int sshift = 0;
int ssize = 1;
while (ssize < concurrencyLevel) {
++sshift;
ssize <<= 1;
}
segmentShift = 32 - sshift;
segmentMask = ssize - 1;
当currentupLevel为1时,segmentShift为32,segmentMask为0。 (哈希>>> 32)=哈希,越过细分数组的限制,则需要segmentMask。