使用较小的锁的颗粒度
减小锁粒度是指缩小锁定对象的范围,从而减小锁冲突的可能性,从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段,这种技术典型的应用是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 锁。
ConcurrentHashMap结构组成
网友评论