JDK的ConcurrentHashMap为什么放弃了分段锁

6. ConcurrentHashMap 为什么放弃了 Segment 分段锁?如何保证高并发安全? | Java 八股文面试网 – Java2Top.cn

JDK7

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组构成的。Segment 是一种可重入的锁 ReentrantLock,HashEntry 则用于存储键值对数据。

get 时不加锁,put 时加锁,锁粒度细,支持并发,但是若并发量低并且 hash 很少映射到同一个 segment 时也要加锁,性能就拉低了。扩容时更要对所有的 segment 加锁,并且加多个分段锁浪费内存空间

JDK8

JDK1.8 中的 ConcurrentHashMap 取消了 Segment 分段锁,采用 CAS + synchronized 代替 ReentrantLock 来保证并发安全性,整个容器只分为一个 Segment。 插入第一个节点时,CAS 直接写入,避免锁竞争。 存在哈希冲突时,才对该桶加 synchronized  进行加锁

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计