星海

集合 · 单选题 · 第 10 题

Java 后端开发面试 · 第 10 题

JDK 8 的 ConcurrentHashMap 是如何保证并发写入安全的?

  1. A把数组划分成 16 个 Segment,每个段一把 ReentrantLock
  2. B空桶用 CAS 写入,非空桶用 synchronized 锁住该桶的头节点
  3. C对整个 Map 的所有方法都加 synchronized,一次只允许一个线程
  4. D读写都要先获取一把全局读写锁,写时阻塞全部读操作

答案

B B. 空桶用 CAS 写入,非空桶用 synchronized 锁住该桶的头节点

解析

JDK 8 放弃了 JDK 7 的 Segment 分段锁,把锁粒度细化到单个桶:桶为空时 CAS 放入,不为空时锁住头节点再操作链表或树。读操作基本不加锁,依赖 volatile 保证可见性。整表加 synchronized 是 Hashtable 的做法,并发度很低。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。