ConcurrentHashMap

笔记/Java/Java基础/Java集合/ConcurrentHashMap

上一篇:HashMap · 下一篇:迭代与陷阱

核心原理#

为什么需要 ConcurrentHashMap#

  • HashMap非线程安全
  • Hashtable:整张表 synchronized,并发度低,不推荐
  • ConcurrentHashMap:细粒度并发控制,现代并发 Map 首选

JDK 1.7:Segment 分段锁#

Segment 数组 + HashEntry 链表;每个 Segment 一把 ReentrantLock,只锁一段数据,提高并发度。

JDK 1.8:对齐 HashMap + 桶级锁#

去掉 Segment;结构为数组 + 链表/红黑树。

  • 空桶:CAS 插入
  • 非空:synchronized 锁桶头(或 TreeBin
  • 不允许 null 键和 null 值(避免二义性)
Map<String, Integer> concurrent = new ConcurrentHashMap<>();
concurrent.put("Tom", 90);
// concurrent.put(null, 1); // NPE

与 HashMap 对比#

HashMapConcurrentHashMap
线程安全
null允许 null 键/值不允许
JDK 8 并发CAS + synchronized 锁桶

常见陷阱#

ConcurrentHashMap 中使用 null 键或 null 值会 NullPointerException

面试速记#

HashMap vs ConcurrentHashMap:线程安全、null 策略;1.8 CHM 用 CAS + 锁桶头,比 Hashtable 粒度更细。

集合面试 52 道

文章目录

文章目录