ConcurrentHashMap 相关
为什么ConcurrentHashMap要放弃分段锁?
答:1、因为在 JDK7 中 Segment
继承了重入锁 ReentrantLock。在每个 Segment
在增长的时候,这时候锁的粒度也会在不断的增长。每个锁控制的是一段,当分段很多,并且加锁的分段不连续的时候,内存空间的浪费比较严重。
在并发操作中,因为分段锁的存在,线程操作的时候,争抢同一个分段锁的几率会小很多
2、既然小了,那么应该是优点了,但是大家有没有想过如果这一分块的分段很大的时候,那么操作的时间是不是就会变的更长了。
所以第二个问题出现了:如果某个分段特别的大,那么就会影响效率,耽误时间。当需要扩容时,需要重新分配段数组,并将原有数据复制到新数组中。这个过程需要停止所有的读写操作,并持有整个ConcurrentHashMap的全局锁,会导致所有的线程都被阻塞,对性能有很大的影响。
3、为了提高 GC 的效率
4、新的同步方案
所以,这也是为什么在 JDK8 不在继续使用分段锁的原因。
ConcurrentHashMap底层详解(图解扩容)(JDK1.8)
JDK1.8的ConcurrentHashMap底层实现解析