ConcurrentHashMap 相关

发布时间 2023-05-22 15:10:08作者: r1-12king

为什么ConcurrentHashMap要放弃分段锁?

答:1、因为在 JDK7 中 Segment 继承了重入锁 ReentrantLock。在每个 Segment 在增长的时候,这时候锁的粒度也会在不断的增长。每个锁控制的是一段,当分段很多,并且加锁的分段不连续的时候,内存空间的浪费比较严重。

在并发操作中,因为分段锁的存在,线程操作的时候,争抢同一个分段锁的几率会小很多

2、既然小了,那么应该是优点了,但是大家有没有想过如果这一分块的分段很大的时候,那么操作的时间是不是就会变的更长了。

所以第二个问题出现了:如果某个分段特别的大,那么就会影响效率,耽误时间。当需要扩容时,需要重新分配段数组,并将原有数据复制到新数组中。这个过程需要停止所有的读写操作,并持有整个ConcurrentHashMap的全局锁,会导致所有的线程都被阻塞,对性能有很大的影响。

3、为了提高 GC 的效率

4、新的同步方案

所以,这也是为什么在 JDK8 不在继续使用分段锁的原因。

 

ConcurrentHashMap底层详解(图解扩容)(JDK1.8)

JDK1.8的ConcurrentHashMap底层实现解析