ConcurrentHashMap1.8之前提供了⼀种粒度更细的加锁机制来实现在多线程下更⾼的性
能,这种机制叫分段锁(Lock Striping)。
提供的优点是:在并发环境下将实现更⾼的吞吐量,⽽在单线程环境下只损失⾮常
⼩的性能。
可以这样理解分段锁,就是将数据分段,对每⼀段数据分配⼀把锁。当⼀个线程占
⽤锁访问其中⼀个段数据的时候,其他段的数据也能被其他线程访问。
有些⽅法需要跨段,⽐如size()、isEmpty()、containsValue(),它们可能需要锁定
整个表⽽⽽不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,⼜按顺序释
放所有段的锁。
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment
是⼀种可重⼊锁ReentrantLock,HashEntry则⽤于存储键值对数据。
⼀个ConcurrentHashMap⾥包含⼀个Segment数组,Segment的结构和HashMap
类似,是⼀种数组和链表结构, ⼀个Segment⾥包含⼀个HashEntry数组,每个
HashEntry是⼀个链表结构(同HashMap⼀样,它也会在⻓度达到8的时候转化为
红⿊树)的元素, 每个Segment守护者⼀个HashEntry数组⾥的元素,当对
HashEntry数组的数据进⾏修改时,必须⾸先获得它对应的Segment锁。