目录
ConcurrentHashMap 一定是线程安全的吗
ConcurrentHashMap 在JDK1.8中ConcurrentHashMap 内部使用的是数组加链表加红黑树的结构,通过CAS+volatile或synchronized的方式来保证线程安全的,这些原理已毋庸置疑,一言不合上代码.
模拟2个线程累计,通过ConcurrentHashMap 储存累计的结果。
/**
* @description: ConcurrentHashMap 真的安全吗
* @author: ppx
* @date: 2023/8/17 14:11
* @version: 1.0
*/
public class TestMap {
private static ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
private static String key = "hello";
/**
* @description: 测试2个线程 执行计算
* @param:
* @return: void
* @author: ppx
* @date: 2023/8/17 16:43
*/
private static void testRun() {
ExecutorService executor = new ThreadPoolExecutor(2, 5,
2L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
for (int i = 0; i < 2; i++) {
executor.submit(() -> {
for (int j = 0; j < 5; j++) {
// 第一步读取
int value = concurrentHashMap.getOrDefault(key, 0);
// 第二步+1
value++;
// 第三补+ 回写map
concurrentHashMap.put(key, value);
}
});
}
executor.shutdown();
// 直到线程执行完成
while(!executor.isTerminated()){
}
System.out.println("执行结果:" + concurrentHashMap.get(key));
}
public static void main(String[] args) {
testRun();
}
}
执行多次:
CAS 机制的注意事项
使用java 并行流 ,您要留意了