Java并发集合类:ConcurrentHashMap源码解析
ConcurrentHashMap
是Java中专为高并发场景设计的线程安全哈希表,其在JDK 1.7和1.8版本中采用了不同的实现机制。
JDK 1.7 分段锁机制
JDK 1.7 中的 ConcurrentHashMap
采用分段锁(Segment)实现线程安全。每个 Segment 都是一个类似于 HashMap
的独立可锁容器,其数量由 concurrencyLevel
参数决定,默认为16。这种设计允许多个线程同时操作不同的 Segment,从而提高并发性能。
然而,分段锁机制也存在一些不足:
- Segment 数组大小固定,限制了动态扩容能力。
- 当多个线程访问同一个 Segment 时,仍需进行锁竞争。
JDK 1.8 CAS 与红黑树
JDK 1.8 对 ConcurrentHashMap
进行了重大优化,放弃分段锁,采用更细粒度的锁机制:
- CAS 无锁操作: 利用 CAS 原语实现对节点的无锁操作,例如
putIfAbsent
。 - 轻量级锁: 当 CAS 操作失败时,使用 synchronized 锁保证线程安全。
- 红黑树优化: 当链表长度超过阈值(默认为8)时,链表会转换为红黑树,提高查找、插入和删除效率。
扩容机制
JDK 1.8 中的 ConcurrentHashMap
采用渐进式扩容策略,避免一次性扩容带来的性能开销:
- 当某个桶的链表长度超过阈值时,触发扩容。
- 扩容过程分多个阶段进行,每次只迁移部分数据。
- 多个线程可以同时参与扩容,提高效率。
ConcurrentHashMap
通过精巧的设计和优化,在保证线程安全的同时,提供了高效的并发访问性能,是高并发场景下的首选集合类之一。