3

我觉得

(hash >>> segmentShift) & segmentMask

等于

(hash >>> segmentShift)

比如ssize是16,sshift是4,所以segmentShift是28,segmentMask是15

hash >>> segmentShift

将获得高 4 位,当使用 segmentMask 进行操作时,没有任何改变。

我有什么误解?

4

2 回答 2

0

好吧,我从这里了解到的是,整个操作

(哈希 >>> 段移位)和段掩码

用于查找表中段的位置。正如您已经提到的, (hash >>> segmentShift) 用于获取密钥哈希的前 4 位。

但是段掩码的主要工作是在段表数组中平均分配段。ConcurrentHashMap 中有很多段,所以为了避免冲突,使用了这个段掩码。段掩码是 [(2 的幂)-1]。

这个概念类似于 HashMap,其中 [hash & (length_of_hashmap-1)] 用于在 hashmap 中查找键的索引。

hashmap 的长度始终是 2 的幂,在这种情况下,segmentmask 也是(2 的幂)-1。

它与 hashmap%size 的 hashmap 概念相同,因此索引不会超出 hahsmap 的长度。

于 2013-08-20T03:19:32.130 回答
0

完全正确!但有一个例外。

        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 。

于 2019-12-24T02:48:48.343 回答