解析ConcurrentHashMap:分段锁到synchronized+红黑树
(❁´◡❁)您的点赞➕评论➕收藏⭐➕关注是作者创作的最大动力 支持我点赞收藏⭐️留言关注欢迎留言讨论我们常常在当下感到时间慢觉得未来遥远但一旦回头看时间已经悄然流逝。对于未来尽管如此也应该保持一种从容的态度相信未来仍有许多可能性等待着我们。JDK8 ConcurrentHashMap深度解析从分段锁到synchronized红黑树的进化之路引言并发容器的演进在多线程并发编程中ConcurrentHashMap无疑是最重要、最常用的并发容器之一。从JDK5引入之初它就以其高效的并发性能赢得了开发者的青睐。然而随着Java版本的演进ConcurrentHashMap的实现经历了深刻的变革。特别是JDK8对其进行的重大重构不仅改变了底层的数据结构更彻底革新了同步机制。本文将深入剖析JDK8中ConcurrentHashMap的实现原理揭示其为何摒弃了原有的分段锁设计转而采用更细粒度的同步策略。(免费无删减无套路)java swing管理系统源码 程序 代码 图形界面11套」链接https://pan.quark.cn/s/784a0d377810提取码见文章末尾(免费无删减无套路) Python源代码开发文档说明23套」链接https://pan.quark.cn/s/1d351abbd11c提取码见文章末尾(免费无删减无套路)计算机专业精选源码论文26套」链接https://pan.quark.cn/s/8682a41d0097提取码见文章末尾(免费无删减无套路)Java web项目源码整合开发ssm30套链接https://pan.quark.cn/s/1c6e0826cbfd提取码见文章末尾(免费无删减无套路)「在线考试系统源码含搭建教程」链接https://pan.quark.cn/s/96c4f00fdb43提取码见文章末尾一、JDK7 ConcurrentHashMap的局限分段锁的痛点1.1 分段锁的设计思想在JDK7及之前ConcurrentHashMap采用了分段锁Segment的设计。整个Map被划分为多个Segment默认为16个每个Segment本质上是一个独立的HashMap拥有自己的锁。这种设计允许多个线程同时访问不同的Segment从而提高了并发度。// JDK7中的Segment结构 static final class SegmentK,V extends ReentrantLock implements Serializable { transient volatile HashEntryK,V[] table; // 其他字段和方法... }1.2 分段锁的局限性虽然分段锁在当时是一种创新的设计但随着硬件的发展和并发场景的变化其局限性逐渐显现锁粒度仍然较粗虽然比Hashtable的全局锁细但每个Segment锁仍然保护着多个桶bucket内存开销较大每个Segment都继承自ReentrantLock包含了复杂的锁状态管理机制并发度受限于Segment数量默认16个Segment意味着最多支持16个线程完全并发查询性能不够优化链表过长时查询时间复杂度退化为O(n)二、JDK8 ConcurrentHashMap的革命性重构2.1 全新的数据结构设计JDK8彻底摒弃了Segment分段锁的设计回归到与HashMap类似的结构但进行了并发优化Node数组table ↓ 每个桶bucket独立 ↓ 链表 → 红黑树条件触发核心数据结构NodeK,V[] table核心的哈希表数组Node节点基本的存储单元包含key、value、hash和next指针TreeNode节点红黑树的节点继承自NodeForwardingNode扩容时的特殊节点2.2 细粒度的同步机制2.2.1 从ReentrantLock到synchronizedJDK8最显著的改变之一是使用synchronized替代了ReentrantLock来同步每个桶的头节点。为什么选择synchronized性能优化经过多年的JVM优化synchronized的性能已经与ReentrantLock相当甚至更好内存开销小synchronized是JVM内置的锁机制不需要额外的内存存储锁状态优化潜力大JVM可以对synchronized进行深度优化如锁消除、锁粗化、偏向锁、轻量级锁等代码简洁减少了显式锁管理的复杂性// JDK8中的putVal方法片段简化版 final V putVal(K key, V value, boolean onlyIfAbsent) { // ... 前置检查 synchronized (f) { // f是桶的头节点 // 插入或更新逻辑 } // ... 后置处理 }2.2.2 CAS操作的广泛应用除了synchronizedJDK8大量使用了CASCompare-And-Swap操作来处理无竞争的并发更新初始化table扩容时的协助迁移计数器更新sizeCtl节点插入前的空桶检查CAS操作通过sun.misc.Unsafe类实现提供了硬件级别的原子性保证。2.3 红黑树的引入解决哈希冲突的终极武器2.3.1 链表到红黑树的转换条件JDK8引入了重要的优化当链表长度过长时会将其转换为红黑树static final int TREEIFY_THRESHOLD 8; // 链表转树的阈值 static final int UNTREEIFY_THRESHOLD 6; // 树转链表的阈值 static final int MIN_TREEIFY_CAPACITY 64; // 可树化的最小表容量转换逻辑当链表长度 ≥ 8且数组长度 ≥ 64时链表转换为红黑树当树节点数 ≤ 6时红黑树退化为链表2.3.2 红黑树的优势红黑树是一种自平衡的二叉查找树具有以下特性最长路径不超过最短路径的两倍保证基本平衡查找、插入、删除的时间复杂度都是O(log n)避免了极端情况下链表过长导致的性能退化实际场景当大量元素哈希到同一个桶时可能是哈希函数问题或恶意攻击红黑树能保证O(log n)的查询效率而链表会退化为O(n)。三、核心操作原理深度剖析3.1 put操作的并发安全实现put操作是ConcurrentHashMap最复杂的操作之一它需要处理多种并发场景// put操作的主要步骤 1. 计算key的hash值spread方法进行再哈希 2. 如果table为空则初始化initTable 3. 定位到具体的桶 4. 如果桶为空CAS插入新节点 5. 如果桶不为空synchronized锁住头节点 6. 遍历链表或树查找key是否存在 7. 存在则更新不存在则插入 8. 检查是否需要树化 9. 更新size通过addCount关键优化点CAS失败重试初始化、空桶插入等操作通过CAS循环实现无锁化锁细化只锁住单个桶的头节点不影响其他桶的操作扩容协作多个线程可以协作完成扩容操作3.2 get操作的无锁优化get操作在JDK8中是完全无锁的这得益于以下设计// get操作的关键特性 1. 不需要加锁直接读取 2. 使用volatile保证内存可见性 3. 遇到ForwardingNode时转发到新表查询 4. 红黑树查找同样无锁为什么get可以不加锁Node的val和next都声明为volatile红黑树的查找是只读操作扩容时使用ForwardingNode保证正确性3.3 扩容机制多线程协作的典范JDK8的扩容机制是其并发设计的精华所在// 扩容的主要步骤 1. 创建新表2倍大小 2. 分配扩容任务stride 3. 线程协作迁移节点 4. 设置ForwardingNode标记已迁移的桶 5. 迁移完成使用新表迁移策略每个线程负责一个区间stride的迁移迁移时对原桶加锁保证迁移的原子性使用ForwardingNode标记已迁移的桶四、性能对比与实战建议4.1 JDK7 vs JDK8性能对比特性JDK7 ConcurrentHashMapJDK8 ConcurrentHashMap锁粒度Segment级别较粗桶级别更细锁类型ReentrantLocksynchronized数据结构数组链表数组链表红黑树最大并发度Segment数量默认16桶数量理论上无限制内存开销较大每个Segment一个锁较小极端情况性能链表可能很长查询O(n)转换为红黑树查询O(log n)4.2 实战使用建议选择合适的初始容量// 预估并发线程数和数据量设置合理的初始容量 int initialCapacity 64; // 根据实际情况调整 ConcurrentHashMapString, Object map new ConcurrentHashMap(initialCapacity);合理设置并发级别// JDK8中concurrencyLevel参数仅用于兼容性实际作用有限 // 推荐使用初始容量和负载因子来控制避免热点桶确保key的hashCode分布均匀自定义对象实现良好的hashCode方法正确使用原子操作// 使用computeIfAbsent等原子方法 map.computeIfAbsent(key, k - createValue(k));五、总结与展望JDK8对ConcurrentHashMap的重构是一次深刻的进化它体现了Java并发编程理念的变迁从粗粒度到细粒度锁粒度细化到每个桶提高了并发性能从复杂到简洁synchronized替代ReentrantLock简化了实现从单一到混合链表红黑树的混合结构兼顾了普通情况和极端情况从独占到协作多线程协作扩容提高了系统整体吞吐量这些改进使得ConcurrentHashMap在高并发场景下表现更加出色能够更好地适应现代多核处理器的架构特点。作为Java开发者深入理解这些原理不仅有助于我们更好地使用这个工具更能提升我们对并发编程本质的理解。随着Java版本的不断演进ConcurrentHashMap仍在持续优化。在未来的JDK版本中我们可能会看到更多基于硬件特性的优化如更细粒度的内存访问控制、更好的缓存友好性设计等。但无论如何变化对并发安全、性能、可扩展性的追求将始终是ConcurrentHashMap设计的核心目标。(❁´◡❁)您的点赞➕评论➕收藏⭐➕关注是作者创作的最大动力 支持我点赞收藏⭐️留言关注欢迎留言讨论

相关新闻

RNOH 稳定性案例分析:从故障现象到根因修复的实战指南

RNOH 稳定性案例分析:从故障现象到根因修复的实战指南

OpenHarmony移动开发跨平台 【免费下载链接】ohos_react_native React Native鸿蒙化仓库 项目地址: https://gitcode.com/CPF-RN/ohos_react_native 点击查看 免费下载 本文基于 ohos_react_native(React Native Harmony / RNOH)仓库的稳定性…

2026/10/14 20:33:52 阅读更多 →
exponent-io/jsonpath 实战解析:Harvester 依赖树中的 Go 流式 JSON 路径导航解码器

exponent-io/jsonpath 实战解析:Harvester 依赖树中的 Go 流式 JSON 路径导航解码器

云原生虚拟化存储后端高可用 【免费下载链接】harvester Open source hyperconverged infrastructure (HCI) software 项目地址: https://gitcode.com/gh_mirrors/ha/harvester 点击查看 免费下载 本文以 Harvester 仓库(开源超融合基础设施软件&#x…

2026/10/14 20:33:52 阅读更多 →
性能优化实战:从毫秒到微秒的延迟优化方法论

性能优化实战:从毫秒到微秒的延迟优化方法论

1. 开篇:一次毫秒到微秒的优化之旅最近在做延迟优化实战,目标是把一个高频核心接口的响应时间从平均 4.8ms 压到 500μs 以下。整个过程中踩了不少坑,也总结出很多通用的优化方法论,花时间把这些记录整理成文。如果你正要面对类似…

2026/10/14 20:32:51 阅读更多 →

最新新闻

华为云ModelArts模型部署五层契约与实战避坑指南

华为云ModelArts模型部署五层契约与实战避坑指南

1. 这不是“云上点点鼠标”的故事,而是一次真实模型落地的全链路复盘我用ModelArts跑通第一个可对外提供API服务的OCR模型时,卡在模型转换环节整整三天——不是因为不会写代码,而是因为没搞懂华为云ModelArts里“推理镜像”和“自定义镜像”的…

2026/10/15 9:32:28 阅读更多 →
CAN物理层测试全解析:从差分电平到采样点的工程实践

CAN物理层测试全解析:从差分电平到采样点的工程实践

简介:这份CAN通讯物理层测试文档面向高校电子、汽车电子及嵌入式方向的学生与测试工程师,聚焦CAN总线物理层性能验证这一核心问题,帮助读者理解通信稳定性与可靠性的评估方法。文档围绕终端电阻、低压与高压通讯范围、显性/隐性输出电压、上升…

2026/10/15 9:32:28 阅读更多 →
Asp.Net Core 3.1默认小驼峰命名问题:根源与解决方法

Asp.Net Core 3.1默认小驼峰命名问题:根源与解决方法

做后端接口联调的时候,前端同事突然丢过来一个问题:“你们接口返回的字段名怎么跟文档不一致?文档里写的是 UserId,实际返回的却是 userId。”我一看还真是——所有属性名都从大驼峰变成了小驼峰。更尴尬的是,Swagger …

2026/10/15 9:32:28 阅读更多 →
清华模电数电试卷高效复习法:从诊断到知识图谱

清华模电数电试卷高效复习法:从诊断到知识图谱

简介:这份资源为清华大学模电与数电课程试卷合集,面向电子信息、自动化、计算机等专业正在备考或复习数字电子技术基础的学生,也适合希望检验自身电路分析能力的学习者。压缩包内共1个doc文档,约30KB,内容以试卷题目与…

2026/10/15 9:32:28 阅读更多 →
巴别鸟MCP接入:复制AI提示词的操作步骤

巴别鸟MCP接入:复制AI提示词的操作步骤

巴别鸟MCP接入:复制AI提示词的操作步骤 在 AI 智能体接入企业文件系统的场景中,Model Context Protocol(MCP)已经成为主流标准。巴别鸟支持通过 MCP 协议将企业文件库与各种 AI 智能体打通,接入地址为 https://www.bab…

2026/10/15 9:32:28 阅读更多 →
知识蒸馏如何加速模型训练:优化动态与收敛性提升

知识蒸馏如何加速模型训练:优化动态与收敛性提升

1. 项目概述:这是一篇讲“知识蒸馏如何意外加速模型训练”的硬核论文“论文阅读 A Gift from Knowledge Distillation: Fast Optimization”——光看标题,你可能以为又是一篇讲怎么把大模型“压缩”成小模型的常规知识蒸馏(Knowledge Distill…

2026/10/15 9:31:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →