ConcurrentHashMap底层数据结构演进

74 阅读1分钟

1. JDK7 ConcurrentHashMap 数据结构

屏幕截图 2025-06-28 155614.png

关键特性

  • 分段锁 (Segment) :将数据分为 16 个 Segment,每个 Segment 是独立的哈希表,可并发访问不同 Segment
  • 锁粒度:每个 Segment 对应一个 ReentrantLock,并发度由 Segment 数量决定 (默认 16)
  • 链表结构:每个 Segment 包含 HashEntry 链表,不支持红黑树
  • 不可变性:HashEntry 的 key 和 hash 为 final,保证线程安全

2. JDK8 ConcurrentHashMap 数据结构

屏幕截图 2025-06-28 160947.png

关键特性

  • 取消 Segment:直接使用 Node 数组,锁粒度细化到单个桶

  • 数据结构升级

    • 链表长度≤8:使用 Node 链表
    • 链表长度 > 8:转换为 TreeBin (红黑树)
  • 锁机制:使用 synchronized+CAS 替代 ReentrantLock,性能更高

  • 扩容支持:ForwardingNode 标记扩容中的桶,实现无阻塞扩容

3. 两个版本核心差异对比图

image.png

4. 版本演进优化点

image.png

核心差异总结

维度JDK7 ConcurrentHashMapJDK8 ConcurrentHashMap
基础架构分段锁 (Segment) 架构扁平化 Node 数组架构
数据结构纯链表链表 + 红黑树 (链表长度> 8 时转换)
锁机制ReentrantLock 分段锁synchronized+CAS 桶级锁
并发度由 Segment 数量决定 (默认 16)由桶数量动态决定,理论更高
扩容方式单线程扩容多线程协作扩容,使用 ForwardingNode
性能表现并发度有限,适合中等并发场景并发度更高,适合高并发场景

JDK8 的优化使得 ConcurrentHashMap 在高并发场景下的性能显著提升,锁粒度的细化和数据结构的升级是其核心改进点。