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 map = new ConcurrentHashMap<>();
map.put("apple", 1);
map.put("banana", 2);
System.out.println(map.get("apple")); // 输出 1
map.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 1.7:采用 Segment(分段锁) 机制
JDK 1.8:改为使用 CAS + synchronized + 链表/红黑树 + 数组
CAS(乐观锁)用于无锁写入
多线程修改时,通过链表同步块控制竞争
多线程环境下需要高效、线程安全的 Map
替代传统的 Hashtable
或 Collections.synchronizedMap
ConcurrentHashMap
是 弱一致性,迭代过程中数据可能改变
不支持 null 键和值
默认并发级别已优化,无需手动设置并发级别