美文网首页
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