美文网首页
ConcurrentHashMap

ConcurrentHashMap

作者: 沐兮_d64c | 来源:发表于2018-08-03 18:11 被阅读0次

1,基础

1)ConcurrentHashMap 是一个 Segment 数组。Segment 通过继承 ReentrantLock 来进行加锁,每一个Segment本身是一个可重入锁。

image.png
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基本一致。并发控制使用Synchronized和CAS来操作,利用一个CAS算法实现无锁化的修改值。

image.png
2)put实现并发控制
image.png

相关文章

网友评论

      本文标题:ConcurrentHashMap

      本文链接:https://www.haomeiwen.com/subject/xvtuvftx.html