我正在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.computeIfAbsent
和Map.computeIfAbsent
关于返回值的书面意图,并且也等效于接口(interface)提供的default
实现。
为了完整起见, default
的Map.computeIfAbsent
实现为