ConcurrentHashMap并发容器特点
使用较小的锁的颗粒度
减小锁粒度是指缩小锁定对象的范围,从而减小锁冲突的可能性,从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段,这种技术典型的应用是ConcurrentHashMap(高性能的HashMap)类的实现。对于HashMap 而言,最重要的两个方法是get 与set 方法,如果我们对整个HashMap 加锁,可以得到线程安全的对象,但是加锁粒度太大。Segment 的大小也被称为ConcurrentHashMap 的并发度。
ConcurrentHashMap使用了分段锁机制来减少锁对象大小
ConcurrentHashMap,它内部细分了若干个小的HashMap,称之为段(Segment)。默认情况下一个ConcurrentHashMap 被进一步细分为16 个段,既就是锁的并发度。
如果需要在ConcurrentHashMap 中添加一个新的表项,并不是将整个HashMap 加锁,而是首先根据hashcode 得到该表项应该存放在哪个段中,然后对该段加锁,并完成put 操作。在多线程环境中,如果多个线程同时进行put 操作,只要被加入的表项不存放在同一个段中,则线程间可以做到真正的并行。
ConcurrentHashMap 是由Segment和HashEntry数组结构组成
ConcurrentHashMap 是由Segment 数组结构和HashEntry 数组结构组成。Segment 是一种可重入锁ReentrantLock,在ConcurrentHashMap 里扮演锁的角色,HashEntry 则用于存储键值对数据。一个ConcurrentHashMap 里包含一个Segment 数组,Segment 的结构和HashMap类似,是一种数组和链表结构, 一个Segment 里包含一个HashEntry 数组,每个HashEntry 是一个链表结构的元素, 每个Segment 守护一个HashEntry 数组里的元素,当对HashEntry 数组的数据进行修改时,必须首先获得它对应的Segment 锁。
![](https://img.haomeiwen.com/i17464222/b88c34ef6cf5cae8.png)