ConcurrenntHashMap

本文详细探讨了ConcurrentHashMap在JDK1.7和1.8中的实现原理。1.7中,它由Segment数组+HashEntry数组+链表组成,使用分段锁实现并发;1.8则采用Node数组+链表/红黑树结构,结合Synchronized和CAS保证线程安全。在put操作中,1.7会尝试加锁并进行rehash,而1.8通过CAS和synchronized插入元素,并在特定条件下转为红黑树。在get和size计算上,两者都采用了无锁或轻量级锁策略确保并发性能。
摘要由CSDN通过智能技术生成

ConcurrenntHashMap

jdk1.7

存储结构

  • Segment 数组 + HashEntry 数组 + 链表

    • Segment默认等于16,可以认为 ConcurrentHashMap 默认支持最多 16 个线程并发

初始化

  • 三个参数

    • CAPACITY默认初始化容量16
    • FACTOR默认负载因子0.75
    • CONCURRENCY_LEVEL默认并发级别16

put

  • 计算出 segment 下标

  • 获得 segment 对象, 判断是否为 null, 是则创建该 segment

    • 这时不能确定是否真的为 null, 因为其它线程也发现该 segment 为 null, 因此在 ensureSegment 里用 cas 方式保证该 segment 安全性
  • 进入 segment 的put 流程

  • 尝试加锁

    • 如果不成功, 进入 scanAndLockForPut 流程
      如果是多核 cpu 最多 tryLock 64 次, 进入 lock 流程
      在尝试期间, 还可以顺便看该节点在链表中有没有, 如果没有顺便创建出来
  • 更新或者新增

  • 新增

    • 之前等待锁时, node 已经被创建, next 指向链表头否则创建新 node,count+1
    • 根据count,看是否需
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值