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