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
进行加锁