1,基础
1)ConcurrentHashMap 是一个 Segment 数组。
image.pngSegment 通过继承 ReentrantLock 来进行加锁,每一个Segment本身是一个可重入锁。
Segment 使用成员变量transient volatile HashEntry<K,V>[] table;
(内部是由 数组+链表 组成的)来存储节点数据,所以每个Segment很像一个HasmMap
。
2)初始化,得到Segment数组。
concurrencyLevel:并发级数、并发数、Segment数,Segment 数组初始化后不可扩容。
![image.png](https://upload-images.jianshu.io/upload_images/[图片上传中...(image.png-c250fb-1533286814872-0)]
-34ba6fe399523839.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Segment[i] 的默认大小为 2,负载因子是 0.75,得出初始阈值为 1.5。也就是以后插入第一个元素不会触发扩容,插入第二个会进行第一次扩容。
2,JDK7
1)ConcurrentHashMap底层结构
image.png
rehash方法不需要考虑并发,因为线程持有该 segment 的独占锁的。
2)put过程
image.png
使用segment[0]初始化其他segment
image.png
往Segment写入前,使用CAS获取该segment的独占锁。
image.png
image.png
3)get过程
image.png
3,JDK8
1)ConcurrentHashMap底层和HashMap基本一致。
image.png并发控制使用Synchronized和CAS来操作,利用一个CAS算法实现无锁化的修改值。
2)put实现并发控制
image.png
网友评论