最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆。
一、ConcurrentHashMap概述
ConcurrentHashMap是Java并发包中提供的线程安全HashMap实现,与HashTable不同,它通过更细粒度的锁机制实现了更高的并发性能。JDK1.7和JDK1.8的实现有显著差异。
二、JDK1.7实现原理
1. 分段锁设计
JDK1.7采用Segment数组+HashEntry数组的结构:
- 整个Map分为多个Segment(默认为16个)
- 每个Segment是一个独立的ReentrantLock
- 每个Segment包含一个HashEntry数组(类似于HashMap的结构)
2. 并发控制机制
- 不同Segment的操作可以完全并行
- 同一Segment的写操作需要获取锁,读操作不需要
- 通过分段锁减小锁粒度,提高并发度
3. 核心属性
final int segmentMask; // 用于定位Segment的掩码
final int segmentShift; // 用于定位Segment的移位量
final Segment<K,V>[] segments; // Segment数组
三、JDK1.8实现原理
JDK1.8进行了重大优化,放弃了分段锁设计。
1. 新数据结构
采用Node数组+链表/红黑树结构(类似HashMap):
- 使用volatile保证可见性
- 采用CAS+synchronized实现无锁化或细粒度锁
- 仍然保持与HashMap相同的哈希算法和扩容机制
2. 关键改进
- 取消Segment分段锁设计
- 使用Node数组作为主要存储结构
- 采用CAS+sychronized实现线程安全
- 优化扩容机制,支持多线程协同扩容
3. 核心属性
transient volatile Node<K,V>[] table; // 哈希桶数组
private transient volatile int sizeCtl; // 控制标识符
四、总结
ConcurrentHashMap通过精妙的设计实现了高并发下的线程安全:
- JDK1.7采用分段锁降低锁竞争
- JDK1.8采用CAS+synchronized进一步细化锁粒度
- 读操作完全无锁,写操作只锁定单个哈希桶
- 多线程协同扩容提高效率
- 是Java并发编程中最重要的工具类之一