一、简单回顾ConcurrentHashMap在jdk1.7中的设计
- 与Hashtable不同的是,ConcurrentHashMap使用的是分段锁技术,将ConcurrentHashMap容器的数据分段存储,每一段数据分配一个Segment,当线程占用一个Segment时,其他线程可以访问其他段的数据.(每个segment都是一个锁). 与hashtable相比,这么设计的目的是对于put, remove等操作,可以减少并发冲突,对不属于同一个片段的节点可以并发操作,大大提高了性能.
Segment : 可重入锁(在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁),继承ReentrantLock, 也称之为桶( 本质上Segment类就是一个小的hashmap,里面table数组存储了各个节点的数据,继承了ReentrantLock, 可以作为互斥锁使用 ) 每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
HashEntry : 主要存储键值对, 这里也可以叫节点
HashEntry源码:
static final class HashEntry<K,V> {
final int hash;
final K key;
volatile V value;
volatile HashEntry<K,V> next;
其中,volatile关键字保证了多线程读取的时候一定是最新值。
ConcurrentHashMap包含一个Segment数组,每个Segment包含一个HashEntry数组,当修改HashEntry数组,采用开链法处理冲突,所以它的每个HashEntry元素又是链表结构的元素。
ConcurrentHashMap构造方法: