Java ConcurrentHashMap中的s0段是什么?

Java ConcurrentHashMap中的s0段是什么?,java,collections,Java,Collections,我是ConcurrentHashMap的新手,我想知道它是如何工作的,所以检查了相同的内部实现。据我所知,基于其内部的并发级别,存在可分段性。但我不明白的是,基于初始容量,再存储一个段S0的逻辑 public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) { if (!(loadFactor > 0) || initial

我是ConcurrentHashMap的新手,我想知道它是如何工作的,所以检查了相同的内部实现。据我所知,基于其内部的并发级别,存在可分段性。但我不明白的是,基于初始容量,再存储一个段S0的逻辑

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;
    int ssize = 1;
    while (ssize < concurrencyLevel) {
        ++sshift;
        ssize <<= 1;
    }
    this.segmentShift = 32 - sshift;
    this.segmentMask = ssize - 1;
    if (initialCapacity > MAXIMUM_CAPACITY)
        initialCapacity = MAXIMUM_CAPACITY;
    int c = initialCapacity / ssize;
    if (c * ssize < initialCapacity)
        ++c;
    int cap = MIN_SEGMENT_TABLE_CAPACITY;
    while (cap < c)
        cap <<= 1;
    // create segments and segments[0]
    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];
    UNSAFE.putOrderedObject(ss, SBASE, s0); // ordered write of segments[0]
    this.segments = ss;
}
公共ConcurrentHashMap(int initialCapacity, 浮点加载因子,int并发级别){ 如果(!(负载系数>0)|初始容量<0 | |并发级别最大分段数) 并发水平=最大分段数; //找到两个大小的最佳匹配参数的幂 int-sshift=0; int-ssize=1; while(ssize<并发级别){ ++换档; 赛泽