当前位置: 首页 > news >正文

ConcurrentHashMap深度解析

一、ConcurrentHashMap 核心作用

ConcurrentHashMap是 Java 并发包(java.util.concurrent)中提供的线程安全的哈希表实现,它的核心作用是:

  • 在多线程环境下,支持高并发的读写操作,避免了HashMap线程不安全导致的问题(如死循环、数据丢失)。
  • 相比传统的Hashtable(全表加锁)或Collections.synchronizedMap()(包装后的 HashMap,也是全表锁),ConcurrentHashMap采用分段锁 / 精细化锁机制,大幅提升了并发性能。
  • 支持并发度(默认 16),允许多个线程同时操作不同的分段区域,读写之间尽可能不阻塞。

二、ConcurrentHashMap 底层实现(按 JDK 版本划分)

ConcurrentHashMap的底层实现在 JDK 1.7 和 JDK 1.8 有重大变化,其中 JDK 1.8 是目前主流使用的版本,我会重点讲解。

1. JDK 1.7 实现:分段锁(Segment + HashEntry)
核心结构
  • Segment:继承自ReentrantLock,是一个可重入锁,相当于 “锁桶”。一个ConcurrentHashMap包含多个Segment(默认 16 个),每个Segment对应一个数组,数组元素是HashEntry链表。
  • HashEntry:存储键值对的节点,结构和HashMapEntry类似,但valuenextvolatile修饰,保证可见性。
核心原理
  • 哈希计算:key 先经过一次哈希得到Segment的索引,再对Segment内的数组做二次哈希,定位到具体的HashEntry节点。
  • 加锁粒度:只对操作的Segment加锁,其他Segment不受影响。例如线程 A 操作 Segment1,线程 B 操作 Segment2,两者可以并行执行,只有操作同一个 Segment 的线程才会互斥。
  • 读写规则
    • 写操作(put/remove):获取对应Segment的锁,完成操作后释放锁。
    • 读操作(get):无需加锁,通过volatile保证节点值的可见性。
2. JDK 1.8 实现:CAS(Compare-And-Swap(比较并交换)) + synchronized + 红黑树(废弃 Segment)

JDK 1.8 抛弃了分段锁,借鉴了HashMap的结构(数组 + 链表 + 红黑树),并通过更精细化的锁机制提升并发性能。

核心结构
  • Node 数组:底层是Node<K,V>类型的数组,Nodevaluenext同样用volatile修饰。
  • TreeNode:当链表长度超过 8,且数组长度≥64 时,链表转为红黑树(和 HashMap 逻辑一致),提升查询效率。
  • ForwardingNode:扩容时的特殊节点,标记当前桶正在扩容,引导读操作到新数组,写操作协助扩容。
核心原理
  1. 哈希计算:和 HashMap 一致(扰动函数 + 取模),直接定位到数组的桶(bucket)。

  2. 加锁粒度:从 “Segment 级” 缩小到 “桶级”—— 只对操作的数组桶(单个 Node 节点)加锁,并发度更高。

  3. 核心操作逻辑

    • put 操作
      1. 计算 key 的哈希值,定位到数组桶。
      2. 如果桶为空,通过CAS无锁方式插入节点(避免加锁开销)。
      3. 如果桶不为空,检查桶的首节点:
        • 若首节点是ForwardingNode(扩容中),协助扩容后再插入。
        • 否则用synchronized锁定首节点,遍历链表 / 红黑树,完成插入 / 覆盖。
      4. 插入后检查链表长度,超过阈值则转为红黑树。
    • get 操作:无需加锁!通过volatile保证节点的可见性,步骤:
      1. 定位到数组桶,检查首节点是否匹配 key,匹配则返回 value。
      2. 不匹配则遍历链表 / 红黑树,找到则返回 value,否则返回 null。
    • 扩容操作:采用 “多线程分段扩容”—— 每个线程负责一部分桶的迁移,通过ForwardingNode标记扩容状态,避免重复扩容。
    • size 操作:无需遍历全表,通过累加baseCount(基础计数)和counterCells(分段计数)实现,避免全表加锁。
  4. 线程安全保障

    • 写操作:CAS(无锁场景) + synchronized(锁桶)保证原子性。
    • 读操作:volatile 保证可见性,无需加锁(弱一致性,允许读到旧值,但不会读到脏数据)。
    • 扩容:多线程协作,避免单线程扩容的性能瓶颈。

三、ConcurrentHashMap 与 HashMap 的核心区别

特性HashMapConcurrentHashMap
线程安全非线程安全线程安全
锁机制无锁JDK1.7:分段锁;JDK1.8:CAS+synchronized
空值支持允许 key/value 为 null(key 仅 1 个)不允许 key/value 为 null(避免并发场景下判空歧义)
迭代器特性快速失败(fail-fast):迭代中修改会抛ConcurrentModificationException弱一致性(fail-safe):迭代器是快照,不会抛异常,可能读到旧值
扩容机制单线程扩容多线程分段扩容(JDK1.8)
性能(多线程)高并发下可能死循环 / 数据错乱,性能差高并发下性能优异,锁粒度极小
使用场景单线程 / 低并发读多写少高并发多线程环境

补充说明

  1. 为什么 ConcurrentHashMap 不支持 null?HashMap 中get(key)返回 null 时,无法区分 “key 不存在” 还是 “key 对应 value 是 null”;而 ConcurrentHashMap 用于多线程场景,若允许 null,会增加并发下的歧义处理成本,因此直接禁止。

  2. 弱一致性的体现:迭代 ConcurrentHashMap 时,迭代器会先获取当前数组的快照,后续数组的修改不会反映到迭代器中,因此不会抛ConcurrentModificationException,但可能读到迭代前的旧数据。

总结

  1. ConcurrentHashMap的核心价值是多线程安全 + 高并发性能,相比传统的线程安全哈希表(Hashtable),它通过精细化锁(分段锁 / JDK1.8 桶锁)和 CAS 机制大幅提升并发效率。
  2. JDK 1.8 是 ConcurrentHashMap 的主流实现,抛弃分段锁,采用 “CAS + synchronized + 红黑树”,锁粒度缩小到单个桶,并发性能更优。
  3. 与 HashMap 的核心区别在于:线程安全、空值支持、迭代器特性,前者适用于高并发场景,后者适用于单线程 / 低并发场景。
http://www.jsqmd.com/news/440842/

相关文章:

  • HashMap与Hashtable的关键区别
  • Python flask微信小程序基于Android的艺术拍卖文化交流平台的设计与实现_r70jc04u
  • 换根 DP 经典模型:O(N) 求解树上经过每个节点的最长路径
  • 公司下属(信息学奥赛一本通- P2141)
  • 国内用户狂喜!NanoBananaPro 免费白嫖+API接入全攻略
  • 逆向如何学习?
  • 2026年2月AI王炸清单:大厂卷疯了,国产模型杀疯了!
  • 工作总结-日志打印
  • 20260305之所思 - 人生如梦
  • 告别笔记杂乱!Trilium Notes+cpolar,随时随地管好你的知识库
  • 哈尔滨69中六年级上册英语(人教版)全6单元导学案|学生版+教师版双配套
  • [学习笔记]trpo——对策略进行显式约束
  • 谷歌NanoBanana 2太强了,一文看懂如何使用!
  • 20260305 - 个人小作品更新
  • 数据库领域 ETL 工具大比拼,谁是王者?
  • 大数据领域数据服务的医疗数据服务
  • 【计算机毕业设计】基于Springboot的民宿预订小程序+LW
  • 复习总结
  • 价值投资中的智能城市地下空间规划系统分析
  • 概率论与数理统计学习笔记(大一第二学期)
  • 作为一个十年老痛风,我尝试了无数方法,在2026年总算找到了终极降尿酸正解 - 品牌企业推荐师(官方)
  • 从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践
  • 2026年美国空派双清包税专线推荐-权威测评综合实力榜单 - 品牌企业推荐师(官方)
  • 早晚代餐怎么选才不踩坑?2026年减脂代餐实测报告,上班族轻松瘦身指南 - 品牌企业推荐师(官方)
  • 2026年房产中介管理系统采购避坑指南:这五个功能必须有 - 品牌企业推荐师(官方)
  • 聚焦同城老板资源对接,助品会打造高效创业生态圈 - 品牌企业推荐师(官方)
  • FPGA篇---LUT(查找表):FPGA 的“万能逻辑引擎”
  • 杭州猎头公司怎么选?推荐南方新华猎头公司2026年3月更新 - 品牌企业推荐师(官方)
  • 测试测试07测试测试07测试测试07测试测试07测试测试07
  • 当您需要被更多客户“看见”:联系福州睿象科技完整指引 - 品牌企业推荐师(官方)