构造器
@SuppressWarnings("unchecked")
public ConcurrentHashMap(int initialCapacity,
float loadFactor, int concurrencyLevel) {
if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
throw new IllegalArgumentException();
if (concurrencyLevel > MAX_SEGMENTS)
concurrencyLevel = MAX_SEGMENTS;
// Find power-of-two sizes best matching arguments
int sshift = 0;
// Segment数组容量
int ssize = 1;
// 保证Segment数组容量是2的幂次方
while (ssize < concurrencyLevel) {
++sshift;
ssize <<= 1;
}
this.segmentShift = 32 - sshift;
// Segment数组容量是不变的,可以预计算求数组地址索引公式的参数值,hash & ( length - 1 ) -> hash & segmentMask
this.segmentMask = ssize - 1;
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
// 计算Segment内的HashEntry数组的容量
int c = initialCapacity / ssize;
// 向上取值如initialCapacity / ssize为1.9,此时c为1,那么要容量要进1得2
if (c * ssize < initialCapacity)
++c;
// Segment内的HashEntry数组的容量
int cap = MIN_SEGMENT_TABLE_CAPACITY;
// 保证Segment内的HashEntry数组的容量是2的幂次方
while (cap < c)
cap <<= 1;
// create segments and segments[0]
// 初始化Segment数组中的第一元素值,一个Segment类似于一个HashMap
Segment<K,V> s0 =
new Segment<K,V>(loadFactor, (int)(cap * loadFactor),
(HashEntry<K,V>[])new HashEntry[cap]);
// 初始化Segment数组
Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];
// 原子操作为Segment数组的第一个元素赋值
UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]
this.segments = ss;
}