initialCapacity是ConcurrentHashMap的初始化容量(默认16),loadfactor是每个segment的负 载因子(默认0.75)
if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; int c = initialCapacity / ssize; if (c * ssize < initialCapacity) ++c; // 变量cap就是segment里HashEntry数组的长度, 不是1,就是2的N次方。 int cap = 1; while (cap < c) cap <<= 1; for (int i = 0; i < this.segments.length; ++i) this.segments[i] = new Segment<K,V>(cap, loadFactor);定位Segment ConcurrentHashMap使用分段锁Segment来保护不同段的数据,那么在插入和获取元素 的时候,必须先通过散列算法定位到Segment ConcurrentHashMap会首先使用 Wang/Jenkins hash的变种算法对元素的hashCode进行一次再散列。 目的是减少散列冲突,使元素能够均匀地分布在不同的Segment上, 从而提高容器的存取效率。假如散列的质量差到极点,那么所有的元素都在一个Segment中, 不仅存取元素缓慢,分段锁也会失去意义。PRivate static int hash(int h) { h += (h << 15) ^ 0xffffcd7d; h ^= (h >>> 10); h += (h << 3); h ^= (h >>> 6); h += (h << 2) + (h << 14); return h ^ (h >>> 16); }ConcurrentHashMap通过以下散列算法定位segment。final Segment<K,V> segmentFor(int hash) { return segments[(hash >>> segmentShift) & segmentMask];}新闻热点
疑难解答