我正在Oracle Java 8实现上测试 ConcurrentHashMap :

ConcurrentMap<String, String> concurrentMap = new ConcurrentHashMap<>();
String result = concurrentMap.computeIfAbsent("A", k -> "B");
System.out.println(result);  // "B"
result = concurrentMap.putIfAbsent("AA", "BB");
System.out.println(result);  // null
Javadoc of computeIfAbsent 确实说

它说,然后返回当前值;如果现在不存在,则返回null。所以它不应该返回null吗?鉴于putIfAbsent也返回null
我在这里想念什么?

最佳答案

ConcurrentMap.computeIfAbsent的代码示例未反射(reflect)实际意图,很可能是由于putIfAbsent的非直观行为引起的错误,而实现则遵循了已记录的意图。这已经在JDK-8174087中报告了
fixed in Java 9

请注意 Map.computeIfAbsent 的契约(Contract)是



省略return语句。但清楚地说



尝试合并并发方面的是 ConcurrentMap.computeIfAbsent 的文档,属于putIfAbsent的非侵害行为:



但它仍然说



并且所记录的意图应优先于代码示例。请注意,实际的 default implementation of ConcurrentMap.computeIfAbsent 与记录的意图一致:



因此,the implementation of ConcurrentHashMap.computeIfAbsent 确实符合ConcurrentMap.computeIfAbsentMap.computeIfAbsent关于返回值的书面意图,并且也等效于接口(interface)提供的default实现。

为了完整起见, default Map.computeIfAbsent实现为

08-28 02:34