Java高级程序员必备ConcurrentHashMap实现原理:扩容遍历与计数

本文深入分析了Java中的ConcurrentHashMap的扩容、遍历及计数机制,揭示了其高性能背后的实现原理。重点讨论了协助扩容的线程协同策略,避免遍历冲突的方法,以及高性能计数器的设计。了解这些内容有助于提升Java程序员在并发场景下的编程能力。
摘要由CSDN通过智能技术生成

ConcurrentHashMap是大多数Java程序员经常使用的集合类,它的实现原理经常出现在很多Java技术面试中,在工作中也时而用到,有必要掌握。在之前的一篇公众号文章中,我们分析了ConcurrentHashMap部分实现原理,涉及到内部数据结构、get操作和put操作这3个方面。基本上,掌握这3点基本可以应付大多数面试和工作需求了。如果你对ConcurrentHashMap的实现原理还有浓厚兴趣,想要进一步了解的话,本文适合你阅读。

在这篇文章中,我们将分析ConcurrentHashMap的以下性能优化措施:

1. 协助搬运(针对resize的优化)

2. 如何遍历

3. 计数器

约定:后文中table指的是ConcurrentHashMap最外层数组,bin指table数组的每个元素。

1. 协助扩容

ConcurrentHashMap中最耗时的操作莫过于扩容(resize),所以对扩容操作进行优化能在很大程度上提高性能,而这个优化手段就是让并发执行put操作的线程协助搬运bin中的Node,把数据项从老数组转移到新数组,从而加速resize操作。具体方案是:在执行put操作的线程中,第一个发现需要扩容的线程负责分配新数组、开始转移部分Node,每次处理一个bin;此后,其他发现有resize正在进行中的线程参与到转移Node工作;其他也在执行put操作但不参与转移工作的线程继续执行原来的put操作(先在原数组中找到bin,如果遇到FowardingNode,则在新数组中插入);执行get操作的线程不参与转移工作,遇到FordwardingNode则到新数组查询。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值