segmentMask在java ConcurrentHashMap中的含义是什么

时间:2013-05-07 01:08:44

标签: java concurrenthashmap

我认为

(hash >>> segmentShift) & segmentMask

等于

(hash >>> segmentShift)
例如,

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

hash >>> segmentShift

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

我误解的重点是什么?

2 个答案:

答案 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。