关于java:JDK7ConcurentHashMap

0次阅读

共计 977 个字符,预计需要花费 3 分钟才能阅读完成。

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;
    }
正文完
 0