深⼊浅出ConcurrentHashMap详解
时间: 2025-01-20 08:58:44 浏览: 58
### ConcurrentHashMap工作原理
ConcurrentHashMap 是 Java 中支持高并发访问的哈希表实现。其内部结构设计旨在提高多线程环境下的读写效率。
#### 高效的并发控制机制
为了减少争用并提升性能,ConcurrentHashMap 将整个映射分割成多个部分来管理锁定[^2]。具体来说:
- **分段锁(Segment)**:每个 Segment 实际上是一个小型的独立哈希表,并且拥有自己的 ReentrantLock 可重入锁实例。这意味着不同 Segments 上的操作可以完全并行执行而互不干扰。
- **细粒度锁定**:当更新某个特定位置的数据项时,只需要对该位置所属的那个 Segment 加锁即可,而不是像 Hashtable 或 synchronized Map那样对整个容器加全局锁。
随着 JDK 版本演进,在JDK 1.8之后版本中,ConcurrentHashMap 的底层实现了优化调整[^3]。新版本移除了显式的 Segment 结构,转而采用了更高效的 CAS (Compare And Swap) 操作配合 Node 节点组成的链表/红黑树来进行同步处理。
#### 近似统计特性
对于 size() 和 isEmpty() 等查询操作,考虑到频繁调用可能带来的性能影响,ConcurrentHashMap 并不会每次都遍历所有元素以获取最准确的结果。相反,它采取了一种基于采样的估算方式来快速给出接近真实情况的答案[^1]。
### 使用方法详解
下面是一些关于如何创建、填充以及安全地迭代 ConcurrentMap 的基本指导:
```java
import java.util.concurrent.ConcurrentHashMap;
public class Example {
public static void main(String[] args){
// 创建一个新的空ConcurrentHashMap
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// 插入键值对
map.put("one", 1);
map.putIfAbsent("two", 2); // 如果不存在则插入
// 获取指定key对应的value
System.out.println(map.get("one"));
// 删除条目
map.remove("one");
// 安全地替换现有entry(仅当旧值匹配时才成功)
boolean replaced = map.replace("two", 2, 3);
System.out.println(replaced ? "Replacement successful." : "No replacement made.");
// 执行批量操作而不担心竞态条件
map.computeIfPresent("three",(k,v)->v*2);
map.merge("four",4,(oldVal,newVal)->newVal+10);
// 遍历map中的每一个entry
for(Map.Entry<String,Integer> entry : map.entrySet()){
String key = entry.getKey();
int value = entry.getValue();
System.out.printf("%s=%d\n",key,value);
}
}
}
```
阅读全文
相关推荐
















