ConCurrentHashMap底层布局

源代码 2024-9-20 20:36:04 74 0 来自 中国
ConcurrentHashMap是线程安全的HashMap。

  • 在jdk1.7中,ConCurrentHashMap接纳分段锁机制,将数据分成一段一段的存储,给每一段数据配一把锁,当一个线程占用锁访问此中一个段数据的时间,其他段的数据也能被其他线程访问
    1.1 ConCurrentHashMap由一个Segment数组和多个HashEntry构成。Segment和HashEntry都是静态内部类。
    1.1 Segment继续重入锁ReentrantLock,一个Segment包含一个HashEntry数组。
    1.2 HashEntry用于封装映射表的键-值对,每个HashEntry是一个链表布局的元素。
    1.3 当对HashEntry数组中的元素举行修改时,起首会获取它对应的Segment锁
    1.4 put利用:key会举行两次hash,第一次key的hash用于定位Segment位置,如果该Segment还未被赋值,则通过CAS举行赋值。第二次key的hash用于找到HashEntry位置,定位到HashEntry的链表头部。
    1.5 get利用:也是会颠末两次hash,第一次key的hash用于定位Segment位置,第二次key的hash用于找到HashEntry位置。,然后遍历该HashEntry下的链表举行对比,乐成就返回,不乐成就返回nul


  • jdk1.8中,接纳Node+CAS+Synchronized来包管并发安全。取消了Segment类,直接锁定HashEntry,低沉了锁的粒度
    2.1 Node是ConcurrentHashMap存储布局的根本单元,继续于HashMap中的Entry,用于存储数据。
    2.2 put利用:根据key盘算出hashCode,根据hashCode定位Node,判定当前Node是否为null,为null则写入数据,使用CAS自旋机制包管写入数据乐成。不为null,则使用Synchronized锁写入数据。如果数目大于8则要转换为红黑树。
    2.3 get利用:根据盘算出来的 hashcode 寻址,是红黑树那就按照树的方式获取值。如果不满意那就按照链表的方式遍历获取值。


您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 01:05, Processed in 0.156335 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表