下文笔者讲述ConCurrentHashMap简介说明,如下所示
ConCurrentHashMap简介
`ConcurrentHashMap`是
Java中用于高并发场景下的线程安全哈希表实现
位于`java.util.concurrent`包中
它是`HashMap`线程安全版本
相较于`Collections.synchronizedMap()`和`Hashtable`
具有更高的并发性能和更好的扩展性
ConCurrentHashMap核心特点
特性 | 描述 |
线程安全 | 支持多线程并发访问而无需外部同步 |
高并发性能 | 使用分段锁(JDK 1.7)或 CAS + synchronized(JDK 1.8)机制提升性能 |
不抛出 `ConcurrentModificationException` | 迭代时允许修改结构 |
键值允许为 null(仅限非并发使用) | 在单线程环境下可插入 null 键/值, | 但不推荐 |
内部实现机制演变
JDK 1.7 及之前:分段锁(Segment)
- 将整个 Map 分成多个 Segment(默认 16 段),
每个 Segment 相当于一个独立的 HashTable。
- 写操作只锁定当前 Segment,提高并发度。
JDK1.8 及之后:
CAS + synchronized + 红黑树优化
- 使用 `synchronized` 对链表头节点加锁,粒度更细。
- 引入红黑树(TreeNode),当链表长度超过阈值(默认 8)时转为红黑树,提高查找效率。
- 使用 `Node` 节点代替 `Entry`,并支持 `volatile` 修饰字段保证可见性。
- 引入辅助类 `ForwardingNode` 实现扩容时的迁移操作。
常用方法说明
1.基本操作
方法名 | 功能 |
[put(K key, V value)] | 插入键值对 |
[get(Object key)] | 获取指定键对应的值 |
[remove(Object key)] | 移除指定键 |
`containsKey(Object key)` | 判断是否包含指定键 |
[size()] | 返回键值对数量(注意: 不是实时精确值) |
2.并发增强方法(JDK 1.8+)
方法名 | 功能 |
`putIfAbsent(K key, V value)` | 如果不存在该键才插入 |
`computeIfAbsent(K key, Function mappingFunction)` | 如果不存在该键, 则计算并插入 |
`computeIfPresent(K key, BiFunction remappingFunction)` | 如果存在该键, 则重新计算值 |
`merge(K key, V value, BiFunction remappingFunction)` | 合并值, 常用于统计 |
`forEach(BiConsumer action)` | 遍历所有键值对(线程安全) |
例
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// 插入数据
map.put("apple", 10);
map.put("banana", 20);
// 获取数据
System.out.println(map.get("apple")); // 输出 10
// 并发更新
map.computeIfPresent("banana", (key, val) -> val + 10); // 30
map.computeIfAbsent("orange", key -> 5); // 插入 orange=5
// 遍历输出
map.forEach((key, value) -> System.out.println(key + ": " + value));
// 移除元素
map.remove("apple");
}
}
ConCurrentHashMap与HashMap/Hashtable对比
特性 | `HashMap` | `Hashtable` | `ConcurrentHashMap` |
线程安全 | ❌ | ✅(方法全同步) | ✅(高效并发控制) |
允许 null 键/值 | ✅ | ❌ | ❌(建议避免) | |
性能 | 高(非线程安全) | 低(粗粒度锁) | 高(细粒度锁/CAS) |
迭代器行为 | fail-fast | fail-fast | 弱一致性迭代器 |
扩容策略 | 单线程扩容 | 单线程扩容 | 多线程协助迁移 |
ConCurrentHashMap适用场景
-高并发读写:
如缓存系统、计数器、共享状态管理等
-需要线程安全又不想加锁:
避免阻塞式操作带来的性能瓶颈
-弱一致性要求的迭代:
迭代过程中允许其他线程修改
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
本文链接:
https://www.Java265.com/JavaJingYan/202506/17491753228487.html
Java265.com
https://www.java265.com
Powered By Java265.com信息维护小组
使用手机扫描二维码
关注我们看更多资讯
java爱好者
|