集合 · 单选题 · 第 10 题
Java 后端开发面试 · 第 10 题
JDK 8 的 ConcurrentHashMap 是如何保证并发写入安全的?
- A把数组划分成 16 个 Segment,每个段一把 ReentrantLock
- B空桶用 CAS 写入,非空桶用 synchronized 锁住该桶的头节点
- C对整个 Map 的所有方法都加 synchronized,一次只允许一个线程
- D读写都要先获取一把全局读写锁,写时阻塞全部读操作
答案
B B. 空桶用 CAS 写入,非空桶用 synchronized 锁住该桶的头节点
解析
JDK 8 放弃了 JDK 7 的 Segment 分段锁,把锁粒度细化到单个桶:桶为空时 CAS 放入,不为空时锁住头节点再操作链表或树。读操作基本不加锁,依赖 volatile 保证可见性。整表加 synchronized 是 Hashtable 的做法,并发度很低。