JAVA8 ConcurrentHashMap.computeIfAbsent 的使用及说明

1.简述

在JAVA8的Map接口中,增加了一个方法computeIfAbsent:

如果mappingFunction(key)返回的值为null或抛出异常,则不会有记录存入map
此方法首先判断缓存MAP中是否存在指定key的值,如果不存在,会自动调用mappingFunction(key)计算key的value,然后将key = value放入到缓存Map。

ConcurrentHashMap中重写了computeIfAbsent 方法确保mappingFunction中的操作是线程安全的。

2.使用方法

可以将原始代码为:

使用computeIfAbsent 代替:

注:mappingFunction方法的结果会作为值直接插入到map中,无需在mappingFunction中再执行put。

3.风险

不能在ConcurrentHashMap.computeIfAbsent方法中进行递归调用,及在mappingFunction方法中不能在进行put相关的操作会造成死循环。

例如:

This is fixed in JDK 9 with JDK-8071667 . When the test case is run in JDK 9-ea, it gives a ConcurrentModification Exception.
https://bugs.openjdk.java.net/browse/JDK-8172951
好在这个问题在java 1.9中已经基本修复了。

0

发表评论

您的电子邮箱地址不会被公开。