ConcurrentHashMap原理分析

ConcurrentHashMap

模型图

ConcurrentHashMap原理分析

 

ConcurrentHashMap(整个Hash表)

容量 initialCapacity

默认初始容量:int DEFAULT_INITIAL_CAPACITY = 16;

负载因子 loadFactor

默认初始负载因子:float DEFAULT_LOAD_FACTOR = 0.75f;

并发级别 concurrencyLevel

默认值:int DEFAULT_CONCURRENCY_LEVEL = 16;

 

Segment(桶,槽)

属性

HashEntry<K,V>[] table;

阈值int threshold;      负载因子float loadFactor;

Segment是一种可重入锁ReentrantLock

每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

 

HashEntry(节点)

属性

final int hash;    final K key;    volatile V value;

final  volatile HashEntry<K,V> next;

HashEntry用于存储元素以及下一个节点的地址

逻辑

初始化

计算Segment<K,V>[] segments的长度ssize,用于初始化segments

通过对1向左移位的方法获取一个ssize,直至ssize >= concurrencyLevel,用于初始化segments

计算每个槽位的数组长度cap,用于初始化第一个槽位Segment<K,V> s0

Cap = (初始容量initialCapacity /槽位个数ssize) 进一法的值,并不小于2(防止添加一个元素后扩容);

s0 = new Segment<K,V>(loadFactor, (int)(cap * loadFactor), (HashEntry<K,V>[])new HashEntry[cap]);

写入

UNSAFE.putOrderedObject(segments, SBASE, s0);

ConcurrentHashMap原理分析

上一篇:[离散化+树状数组]CodeForces - 652D Nested Segments


下一篇:15-09-02(日期计算)