ConcurrentHashMap 深度解析(基于 JDK 8)
ConcurrentHashMap 是 Java 并发包(java.util.concurrent)中提供的线程安全的 Map 实现,专为高并发场景设计。它解决了传统 Hashtable 全表锁效率低下的问题,通过细粒度的同步机制(JDK 8 中为 CAS + synchronized)实现高效并发,是多线程环境下键值对存储的首选。
ConcurrentHashMap 核心特性
线程安全
通过细粒度同步机制(而非全表锁)保证多线程读写安全,不同桶(数组索引)的操作可并发执行,大幅提升并发效率。
高效并发
- 读操作(
get)无锁(依赖volatile保证可见性),性能接近HashMap。 - 写操作(
put、remove)仅锁定哈希冲突的链表 / 红黑树头节点,不阻塞其他桶的操作。
不允许 null 键值
键(key)和值(value)均不能为 null,避免与 get 方法返回 null 的歧义(无法区分 “键不存在” 和 “值为 null”)。
支持原子操作
提供 putIfAbsent、remove(带条件)、replace 等原子操作,无需额外同步即可实现线程安全的复合逻辑(如 “不存在则插入”“存在则更新”)。
弱一致性迭代器
迭代器遍历期间允许其他线程修改集合,不会抛出 ConcurrentModificationException(弱一致性),但可能无法实时反映最新修改。
底层结构与并发机制演变
ConcurrentHashMap 的底层结构随 JDK 版本演进,核心差异在于锁机制: