public ConcurrentHashMap(int initialCapacity,
float loadFactor, int concurrencyLevel) {
int sshift = 0;
int ssize = 1;
//找到一个大于或等于concurrencyLevel 的一个
//2的幂次方数
while (ssize < concurrencyLevel) {
++sshift;
ssize <<= 1;
}
//前面用于取hashcode的高位进行运算
this.segmentShift = 32 - sshift;
this.segmentMask = ssize - 1;
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
//确定HahsEntry数组的长度
int c = initialCapacity / ssize;
//下面除可能造成了“向下取整”,而这里要“向上取整”
//所以进行以下判断进行+1
if (c * ssize < initialCapacity)
++c;
//MIN_SEGMENT_TABLE_CAPACITY 默认为2,
//即HashEntry数组最小长度为2
int cap = MIN_SEGMENT_TABLE_CAPACITY;
//这里同样是找一个大于等于c的一个2的幂次方数
//cap就是HashEntry对象的容量
while (cap < c)
cap <<= 1;
// create segments and segments[0]
//创立一个Segment s0对象寄存在Segment数组下标为0的
//地位,便于前面寄存元素不必再从新计算HahsEntry
//的容量等属性(原型设计思维)
Segment<K,V> s0 =
new Segment<K,V>(loadFactor, (int)(cap * loadFactor),
(HashEntry<K,V>[])new HashEntry[cap]);
Segment<K,V>[] ss = (Segment<K,V>[])new Segment[ssize];
//将s0写入ss数组地址为SBASE的地位(就是下标为0)
UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]
this.segments = ss;
}
发表回复