繁体   English   中英

java ConcurrentHashMap中的segmentMask是什么意思

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM