JDK1.7
结构
数据结构是数组+segment对象,采用segment分段锁和CAS保证并发。
加锁
JDK1.7中的ConcurrentHashMap是由 segment数组结构和 HashEntry 数组结构组成,即
ConcurrentHashMap把哈希桶切分成小数组(Segment ),每个Segment 有n个 HashEntry组成。其中,Segment继承了ReentrantLock,所以Segment是一种可重入锁,扮演锁的角色;HashEntry用于存储键值对数据。
JDK1.8
结构
数据结构和1.8的HashMap一样,是数组+链表+红黑树。
加锁
jdk1.8 的ConcurrentHashMap舍弃了1.7的segment分段锁,采用了CAS+sycronized来并发。
将锁的级别控制在了更细粒度的哈希桶元素级别,也就是说只需要锁住这个链表头结点(红黑树的根节点),就不会影响其他的哈希桶元素的读写,大大提高了并发度。
区别
1.数据结构:
1.7:数组+segment对象
1.8:数组+链表+红黑树
2.线程安全机制:
1.7:采用Segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock.
1.8:采用CAS+Synchronized保证线程安全.
3.锁的粒度:
1.7:对需要进行数据操作的Segment加锁.
1.8:对每个数组的头节点进行加锁(Node).
4.查询时间复杂度:
1.7:遍历链表O(n).
1.8:遍历红黑树O(logn).