在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中执行`mappingFunction`

我正在尝试查看实际的Java文档,该文档描述了在传递给ConcurrentHashMap.computeIfAbsentConcurrentHashMap.computeIfPresent方法时可以调用mappingFunction次数。

ConcurrentHashMap.computeIfAbsent的Javadoc似乎很清楚,表示mappingFunction最多只执行一次:

ConcurrentHashMap.computeIfAbsent Javadoc

如果指定的键尚未与值关联,则尝试使用给定的映射函数计算其值,并将其输入此映射,除非为null。 整个方法调用是以primefaces方式执行的, 因此每个键最多应用一次该函数 。 其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射。

但是ConcurrentHashMap.computeIfPresent的Javadoc没有说明可以执行mappingFunction次数:

ConcurrentHashMap.computeIfPresent Javadoc

如果存在指定键的值,则尝试在给定键及其当前映射值的情况下计算新映射。 整个方法调用以primefaces方式执行。 其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射。

通过查看源代码,他们看起来就像mappingFunction最多只执行一次。 但我真的希望看到保证这种行为的实际文档。

有这样的文件吗?

ConcurrentMap#computeIfPresent的文档中,我们看到以下内容:

默认实现等效于对此映射执行以下步骤:

 for (V oldValue; (oldValue = map.get(key)) != null; ) { V newValue = remappingFunction.apply(key, oldValue); if ((newValue == null) ? map.remove(key, oldValue) : map.replace(key, oldValue, newValue)) return newValue; } return null; 

尽管文档没有明确说明重映射function只会执行一次,但文档提供的等效代码却清楚了。

注意 :请记住:

当多个线程尝试更新时, 可以多次调用映射操作和重映射function

(强调我的)