JDK1.7
HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问的线程都必须竞争同一把锁,
那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
JDK1.8
则使用 数组+链表+红黑树数据结构 和 CAS原子操作实现
锁分段机制的ConcurrentHashMap 模拟图如下:
ConcurrentHashMap找那个定义了一个Segment<K, V>[]数组来讲Hash表分段存储,从而实现分段加锁;而每个Segment元素则与HashMap结构类似,其包含了一个HashEntry数组,用来存储Key/Value对。Segment继承了ReetrantLock,表示Segment是一个可重入锁,因此ConcurrentHashMap通过可重入锁对每个分段进行加锁。