ConcurrentHashMap
ConcurrentHashMap
是 Java 中的一个并发集合类,属于 java.util.concurrent
包。它是线程安全的 HashMap
实现,允许多个线程高效地并发访问和修改映射数据。
🧠 核心特点
特性 | 说明 |
---|---|
线程安全 | 通过内部分段或锁机制实现并发访问 |
高性能 | 允许多个线程同时读写不同的部分,性能远优于 Hashtable |
不允许空键或空值 | put(null, ...) 或 put(..., null) 都会抛出 NullPointerException |
弱一致性迭代器 | 在迭代过程中,能容忍并发修改,但不保证实时一致性 |
import java.util.concurrent.ConcurrentHashMap;public class Main {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();map.put("apple", 1);map.put("banana", 2);System.out.println(map.get("apple")); // 输出 1map.forEach((key, value) -> System.out.println(key + ": " + value));}
}
🔧 常用方法
方法 | 描述 |
---|---|
put(K key, V value) | 插入键值对 |
get(Object key) | 获取指定键的值 |
remove(Object key) | 移除指定键及其值 |
containsKey(Object key) | 判断是否包含某键 |
computeIfAbsent | 键不存在时计算并插入值 |
putIfAbsent | 仅当键不存在时插入 |
🛡️ 内部实现机制(JDK 8)
-
JDK 1.7:采用 Segment(分段锁) 机制
-
JDK 1.8:改为使用 CAS + synchronized + 链表/红黑树 + 数组
-
CAS(乐观锁)用于无锁写入
-
多线程修改时,通过链表同步块控制竞争
-
✅ 适用场景
-
多线程环境下需要高效、线程安全的
Map
-
替代传统的
Hashtable
或Collections.synchronizedMap
🚫 注意事项
-
ConcurrentHashMap
是 弱一致性,迭代过程中数据可能改变 -
不支持 null 键和值
-
默认并发级别已优化,无需手动设置并发级别