1. JDK7 ConcurrentHashMap 数据结构
关键特性:
- 分段锁 (Segment) :将数据分为 16 个 Segment,每个 Segment 是独立的哈希表,可并发访问不同 Segment
- 锁粒度:每个 Segment 对应一个 ReentrantLock,并发度由 Segment 数量决定 (默认 16)
- 链表结构:每个 Segment 包含 HashEntry 链表,不支持红黑树
- 不可变性:HashEntry 的 key 和 hash 为 final,保证线程安全
2. JDK8 ConcurrentHashMap 数据结构
关键特性:
-
取消 Segment:直接使用 Node 数组,锁粒度细化到单个桶
-
数据结构升级:
- 链表长度≤8:使用 Node 链表
- 链表长度 > 8:转换为 TreeBin (红黑树)
-
锁机制:使用 synchronized+CAS 替代 ReentrantLock,性能更高
-
扩容支持:ForwardingNode 标记扩容中的桶,实现无阻塞扩容
3. 两个版本核心差异对比图
4. 版本演进优化点
核心差异总结
维度 | JDK7 ConcurrentHashMap | JDK8 ConcurrentHashMap |
---|---|---|
基础架构 | 分段锁 (Segment) 架构 | 扁平化 Node 数组架构 |
数据结构 | 纯链表 | 链表 + 红黑树 (链表长度> 8 时转换) |
锁机制 | ReentrantLock 分段锁 | synchronized+CAS 桶级锁 |
并发度 | 由 Segment 数量决定 (默认 16) | 由桶数量动态决定,理论更高 |
扩容方式 | 单线程扩容 | 多线程协作扩容,使用 ForwardingNode |
性能表现 | 并发度有限,适合中等并发场景 | 并发度更高,适合高并发场景 |
JDK8 的优化使得 ConcurrentHashMap 在高并发场景下的性能显著提升,锁粒度的细化和数据结构的升级是其核心改进点。