赞
踩
java.util.concurrent.ConcurrentHashMap
(简称CHM)是Java并发编程工具包中的一个线程安全且高性能的哈希表实现。它允许在多线程环境下并发读写操作,而无需外部同步控制。相较于传统的Hashtable
,它的优势在于更高的并发性能,因为它采用了分段锁(Segment Lock)的设计,也称为分段并发控制(Segmented LRU)。这意味着不是在整个表上加锁,而是将表分成多个段(segments),对每一个段独立加锁,这样在多线程环境下,不同段之间可以并发执行读写操作。
在Java 1.8版本以后,ConcurrentHashMap进行了较大的优化,摒弃了原有的Segment设计,改为采用CAS算法配合 synchronized 来保证并发更新的安全性,并且同样引入了红黑树来优化链表过长的情况。
以下是一个简单的ConcurrentHashMap使用示例:
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
private ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
// 插入数据
public void putKeyValuePair(String key, int value) {
concurrentMap.put(key, value);
}
// 获取数据
public Integer getValue(String key) {
return concurrentMap.get(key);
}
// 更新数据(若key已存在,则更新;否则插入)
public void putIfAbsent(String key, int newValue) {
concurrentMap.putIfAbsent(key, newValue);
}
// 并发增加计数
public void incrementCount(String key) {
concurrentMap.compute(key, (k, v) -> v == null ? 1 : v + 1);
}
public static void main(String[] args) {
ConcurrentHashMapExample example = new ConcurrentHashMapExample();
// 同时在多个线程中操作同一个ConcurrentHashMap
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
String threadName = Thread.currentThread().getName();
example.incrementCount(threadName);
}
};
// 创建并启动两个线程
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
// 等待两个线程完成任务
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 输出每个线程的名字及其对应的计数
for (String key : example.concurrentMap.keySet()) {
System.out.println("Thread: " + key + ", Count: " + example.concurrentMap.get(key));
}
}
}
上述示例展示了如何创建和使用ConcurrentHashMap,包括插入、获取、使用putIfAbsent
方法防止重复添加以及使用compute
方法并发递增计数。在main方法中,我们创建了两个线程,它们都在同一个ConcurrentHashMap上调用了incrementCount
方法,以展示其在多线程环境下的并发安全性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。