《Java并发编程的艺术》| ConcurrentHashMap 在 JDK 1.7 与 1.8 的底层实现

摘要:本篇围绕 Java 并发容器核心,详细解析了 ConcurrentHashMap 在 JDK 1.7 和 JDK 1.8 版本中的实现原理与演进,并对比了其与 HashMap、Hashtable 的核心差异。

第6章 Java 并发容器

6.1 ConcurrentHashMap的实现原理与使用

6.1.1 为什么要使用ConcurrentHashMap

  • JDK1.7中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。因此,JDK1.8使用尾插法插入元素,在扩容时会保持链表元素原本的顺序,不会出现环形链表问题。

  • 多线程同时执行 put 操作,如果计算出来的索引位置是相同的,那会造成前一个 key 被后一个 key 覆盖,从而导致元素的丢失。此问题在JDK 1.7和 JDK 1.8 中都存在。


常见的线程安全Map集合:

  • Hashtable是早期 Java 提供的线程安全的Map实现,它的实现方式与HashMap类似,但是在每个可能修改Hashtable状态的方法上加上synchronized关键字。

  • ConcurrentHashMap在 JDK 1.8 以前采用了分段锁等技术来提高并发性能。在ConcurrentHashMap中,将数据分成多个段(Segment),每个段都有自己的锁。在进行插入、删除等操作时,只需要获取相应段的锁,而不是整个Map的锁,这样可以允许多个线程同时访问不同的段,提高了并发访问的效率。在 JDK 1.8 以后是通过 volatile + CAS 或者 synchronized 来保证线程安全的。

6.1.2 ConcurrentHashMap 的结构

ConcurrentHashMap是由Segment和HashEntry组成。 Segment是一种可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组。Segment的结构和 HashMap类似,是一种数组和链表结构。一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得与它对应的Segment锁。

这组图展示的是JDK 1.7 版本ConcurrentHashMap的核心设计,它是为了解决HashMap线程不安全和Hashtable效率低下的问题而诞生的。

分层结构与原理

  1. ConcurrentHashMap层(顶层容器)

    1. 内部维护一个Segment数组,相当于把整个哈希表拆分成了多个 "小 HashMap"。

    2. 这种 "分段锁" 设计,让不同 Segment 上的操作可以并发执行,大大提升了并发效率。

  2. Segment 层(分段锁实现)

    1. Segment本身继承了ReentrantLock,扮演锁的角色。

    2. 每个Segment守护着一个HashEntry数组,修改该数组中的元素前必须先获取对应的 Segment 锁。

    3. 它的结构和HashMap类似,也是数组 + 链表的结构。

  3. HashEntry 层(数据存储单元)

    1. 用于存储具体的键值对(Key-Value)。

    2. 每个HashEntry链表结构的节点,当发生哈希碰撞时,会以链表形式追加在对应位置

通俗来讲:

ConcurrentHashMap= 多个Segment组成的数组 | Segment = HashEntry数组 +ReentrantLock

Segment = HashEntry+ HashEntry ... | HashEntry(元素) = key + value + next 指针 +哈希值

ConcurrentHashMap怎么实现的? ⭐

JDK 1.7ConcurrentHashMap

JDK 1.7 中 ConcurrentHashMap 的底层结构是Segment[]数组(默认长度 16,不可扩容) + 每个 Segment 内部的HashEntry[]数组 + 链表;每个 Segment 继承自 ReentrantLock,持有独立的分段锁,相当于一个"小 HashMap"(HashEntry[]数组),各自管理一个 HashEntry [] 数组(存储该分段下的键值对);HashEntry 数组的每个元素是单向链表的头节点,哈希冲突的键值对以链表形式存储在同一个桶中。


JDK 1.8ConcurrentHashMap

在 JDK 1.7 中,ConcurrentHashMap 虽然是线程安全的,但因为它的底层实现是数组 + 链表的形式,所以在数据比较多的情况下访问是很慢的,因为要遍历整个链表,而 JDK 1.8 则使用了数组 + 链表/红黑树的方式优化了 ConcurrentHashMap 的实现,具体实现结构如下:

JDK 1.8 ConcurrentHashMap JDK 1.8 ConcurrentHashMap 主要通过 volatile + CAS 或者 synchronized 来实现的线程安全的。

添加元素时首先会判断容器是否为空:

如果为空则使用volatileCAS来初始化Node[]数组

如果容器不为空,定位元素位置并处理。

分两种情况处理:

  • 目标位置为空:直接通过CAS操作将新节点放入该位置(无需加锁,高效)。

  • 目标位置不为空(存在哈希冲突,已有链表或红黑树):

    • synchronized 锁定该位置的头节点(只锁链表 / 红黑树,而非数组,粒度更细)。

    • 遍历该位置的链表 / 红黑树,判断是否存在相同的键:若存在则替换值,否则新增节点。

    • 操作完成后,判断链表长度是否超过阈值,若超过则转为红黑树(优化查询性能)。

如果把上面的执行用一句话归纳的话,就相当于是ConcurrentHashMap通过对头结点加锁来保证线程安全的,锁的粒度相比 Segment 来说更小了,发生冲突和加锁的频率降低了,操作性能提高。

而且 JDK 1.8 使用的是红黑树优化了之前的固定链表,那么当数据量比较大的时候,查询性能也得到了很大的提升,从之前的 O(n) 优化到了 O(logn) 的时间复杂度。

ConcurrentHashMap用了悲观锁还是乐观锁?

悲观锁和乐观锁都有用到。

添加元素时首先会判断容器是否为空:

  • 如果为空则使用 volatile 加 CAS (乐观锁) 来初始化。

  • 如果容器不为空,则根据存储的元素计算该位置是否为空。

  • 如果根据存储的元素计算结果为空,则利用 CAS(乐观锁) 设置该节点;

  • 如果根据存储的元素计算结果不为空,则使用 synchronized(悲观锁) ,然后,遍历桶中的数据,并替换或新增节点到桶中,最后再判断是否需要转为红黑树,这样就能保证并发访问时的线程安全了。


恭喜你学习完本节内容!✿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1205445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web自动化测试知识总结

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、自动化测试基本介绍 1、自动化测试概述: 什么是自动化测试?一般说来所有能替代人工测试的方式都属于自动化测试,即通过工…

EasyGBS在物业视频安防管理中的应用实践

一、方案背景在现代物业服务中,高效的安全管理与便捷的服务运营至关重要。随着科技的不断发展,物业行业对智能化、集成化管理系统的需求日益增长。EasyGBS作为一款基于国标GB28181、RTSP、ONVIF、RTMP协议的视频监控平台和算法算力平台,具备强…

EasyGBS智慧厨房全方位监控与管理方案设计

在食品安全与餐饮管理日益受到重视的今天,厨房作为食品加工的核心场所,其操作规范性、卫生状况及安全管控已成为社会关注的焦点。传统视频监控系统往往局限于“看得见”,却难以实现“看得懂”“管得住”。而国标GB28181算法算力平台EasyGBS的…

【论文自动阅读】LLARVA: Vision-Action Instruction Tuning Enhances Robot Learning

快速了解部分 基础信息(英文): 1.题目: LLARVA: Vision-Action Instruction Tuning Enhances Robot Learning 2.时间: 2024 3.机构: Berkeley AI Research (BAIR), UC Berkeley 4.3个英文关键词: LMMs, Vision Action Instruction Tuning, Ro…

2025年潍坊最好的花灯生产厂家有哪些,智能花灯/华景花灯/国风花灯/十二生肖花灯/宫灯/国潮花灯,花灯订制厂家哪家靠谱

近年来,随着文旅产业与消费场景的深度融合,花灯作为兼具文化属性与商业价值的载体,正从传统节庆装饰向常态化商业美陈转型。尤其在商场、文旅综合体等场景中,智能互动化、定制化的花灯产品需求激增。然而,市场鱼龙…

市面上天虹购物卡回收流行的三种方式

天虹购物卡因其广泛的使用场景,常作为节日礼品、员工福利流通于大众生活中,但闲置问题也随之凸显。数据显示,每年有近三成的天虹购物卡因过期、无使用需求等原因被闲置,不仅造成资产浪费,也让持卡人面临“留之无用…

基于区块链的长输管道工程物资管理【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制,查看文章底部微信二维码(1)分布式账本技术解决物资管理信息孤岛难题长距离输送管…

多目标约束装配式建筑施工调度优化【附模型】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制,查看文章底部微信二维码(1)装配式建筑施工调度多目标优化模型构建装配式建筑作为建筑工业化的重要发展方…

船舶修理项目优先级评价体系构建研究

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅ 成品或定制,查看文章底部微信二维码(1)船舶修理企业多项目并行管理的资源冲突问题分析船舶修理行业作为支撑全球海运…

火灾应急决策方案智能优选模型【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 成品或定制,查看文章底部微信二维码 (1)基于知识图谱的火灾应急信息体系构建方法 火灾应急…

吉林市船营昌邑龙潭丰满英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

在全球化留学热潮下,雅思考试已成为吉林市船营、昌邑、龙潭、丰满四区学子通往海外名校的关键门槛,但雅思培训市场的鱼龙混杂让众多考生深陷备考困境。多数考生面临词汇积累与解题能力脱节、口语开口难、写作逻辑混乱…

2026年南通中考复读学校费用及排名情况分析

2026年江苏中考竞争持续升温,中考复读成为众多失利学子重启梦想的关键选择。无论是寻求正规化的教学管理、个性化的提分方案,还是全周期的备考支持,优质中考复读学校的专业能力直接决定学生来年的升学结果与成长轨迹…

说说苏州信誉好的复读公司,鸿文复读学校经验丰富,口碑卓越?

本榜单依托全维度市场调研与真实家长反馈,深度筛选出五家江苏地区口碑突出的复读机构,为有复读需求的学生及家长提供客观依据,助力精准匹配适配的升学助力伙伴。 TOP1 推荐:南通市鸿文复读学校 推荐指数:★★★★…

四平市铁西铁东梨树伊通英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

在雅思培训热潮席卷四平市铁西、铁东、梨树、伊通等区域的当下,众多出国考生深陷备考与选课困境:优质教育机构筛选缺乏权威依据,不同基础考生对提分技巧、个性化方案的需求难以精准匹配,部分机构存在性价比失衡、提…

分析四季南山奕骼奶粉配料表,看看营养搭配是否靠谱?

一、认知基础篇 问题1:四季南山奕系列奶粉的配料表有什么独特之处?和普通中老年奶粉有何区别? 四季南山奕系列奶粉是专门针对中老年人复合型健康需求设计的功能型奶粉,其配料表大的特点是精准匹配需求场景+科学营养…

kubectl plugin:neat 的安装与使用

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作…

陇南市英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

经教育部教育考试院备案认证、全国雅思教学质量评估中心专项指导,参照《2025-2026中国大陆雅思备考趋势白皮书》核心指标,结合陇南市武都区、宕昌县、成县、徽县8400份有效考生调研问卷、86家教育机构实地核查及跨区…

2026视频制作市场评测:哪些公司值得信赖?服务知名化妆品品牌的视频制作公司选哪家精选实力品牌

在美妆行业竞争白热化的当下,视频制作已成为品牌塑造差异化形象、抢占消费者心智的核心工具。从新品上市的视觉引爆到日常营销的内容沉淀,高质量视频直接决定了品牌的传播效率与市场转化率。杭州帕特广告策划有限公司…

MonkeyCode 提速 Bug 修复,AI 精准定位让编码不中断

长亭MonkeyCode AI开发平台上线:免费算力赋能,AI助力全场景工程级研发落地 当前AI编程工具层出不穷,但多数仅能应对“代码撰写、Demo运行”的基础场景,难以匹配真实工程研发的复杂诉求。长亭科技全新推出的AI开发平…

arm-linux 系统allwinner R528 外挂的sd卡片为什么只能传输189.54M文档

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …