ConcurrentHashMap底层原理
ConcurrentHashMap
是 Java 并发包(java.util.concurrent
)中提供的一个线程安全的哈希表实现。它通过分段锁(JDK 1.7)和 CAS + synchronized(JDK 1.8)等机制来实现高效的并发访问。以下是 ConcurrentHashMap
的底层原理详细分析:
1. JDK 1.7 的分段锁机制
在 JDK 1.7 中,ConcurrentHashMap
使用 分段锁(Segment) 来实现并发控制。
1.1 数据结构
-
ConcurrentHashMap
内部包含一个Segment
数组,每个Segment
是一个独立的哈希表。 -
每个
Segment
继承自ReentrantLock
,可以独立加锁。
1.2 分段锁的优势
-
不同的
Segment
可以并发访问,提高了并发性能。 -
锁的粒度更细,减少了锁竞争。
1.3 分段锁的缺点
-
实现复杂,代码难以维护。
-
锁的粒度仍然较大,无法完全避免锁竞争。
2. JDK 1.8 的 CAS + synchronized 机制
在 JDK 1.8 中,ConcurrentHashMap
抛弃了分段锁,改用 CAS + synchronized 来实现并发控制。
2.1 数据结构
-
ConcurrentHashMap
使用一个Node<K,V>[] table
数组来存储键值对。 -
每个
Node
是一个链表节点或红黑树节点。
2.2 核心思想
-
使用 CAS(Compare And Swap) 操作来实现无锁化的插入和更新。
-
使用 synchronized 锁住单个桶(链表或红黑树)来实现并发控制。
3. 核心参数
-
初始容量(initialCapacity)