java - java ConcurrentHashMap中的segmentMask是什么意思

标签 java concurrenthashmap

我认为

(hash >>> segmentShift) & segmentMask

等于

(hash >>> segmentShift)

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

hash >>> segmentShift

将得到高4位,当与segmentMask进行&操作时,没有任何改变。

我有什么误解吗?

最佳答案

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

(hash >>> segmentShift) & segmentMask

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

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

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

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

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

关于java - java ConcurrentHashMap中的segmentMask是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409674/

相关文章:

java - 测试 Spring 管理的 servlet

java - Buffered reader 和 InputStreams 的不同可能嵌套

java - 更新 map 并阅读时锁定免费解决方案

java - 多线程环境下使用的Hashmap

android - Android : multithread a concern? 中的 HashMap、SparseArray

java - 从intellij运行tomcat时不断警告

java - 添加按钮时类型不兼容

java - 为什么HashMap(JDK1.8)中hash的计算不需要像ConcurrentHashMap那样考虑负的hashCode?

java - HashMap String 和 Count 每个词被使用的次数

java - 你能帮助我避免在主/从 Ant build设置中出现困惑的 JUnit 吗?