ConcurrentHashMap详解

来源:互联网 发布:图片 js 点击放大 wap 编辑:程序博客网 时间:2024/05/16 10:52

结构:

Segment数组结构+HashEntry数组结构。

其中,Segment是一种可重入锁(ReenTrantLock),它的数据结构和HashMap类似,是一种数组和链表结构。

一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素。

对HashEntry数组进行修改的时候,必须先获得它对应的Segment锁。

初始化:

通过initialCapacity、loadFactor和conCurrencyLevel等几个参数来初始化segment数组。

还有segmentShift段偏移量、segmentMask段掩码、每个segment里的HashEntry数组。

concurrencyLevel一般指

你需要的并发等级,而segment数组长度为了能进行按位与(效率高),必须是2的N次方,

因此ssize即数组长度的取值为ssize>=concurrencyLevel,and ssize =2^N。

concurrencyLevel最大值为65535,意味着ssize最大为65535.

默认情况下concurrencyLevel为16,所以sshift=N。

segmentShift:

用于定位参与散列运算的位数,它等于32-sshift。

用32是因为Hash()方法输出的最大位数为32.

segmentMask:

是散列运算的掩码,为ssize-1,它的各个位的值都是1,以便增加散列性能,减少冲突的发生。

对于segment:

segment的容量threshold=(int)cap*loadFactor,默认情况下,initialCapacity=16,loadFactor=0.75,通过运算cap=1,threshold=0.

其中cap是HashEntry数组的长度,不是1就是2^N。

定位segment:

1、使用分段锁来保护不同段的数据:在插入或获取元素的时候,先通过散列算法定位到Segment。

使用的是Wang/Jenkins的变种算法对元素的hashCode再进行一次散列,提高容器的存储效率。



原创粉丝点击