在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中执行`mappingFunction`
我正在尝试查看实际的Java文档,该文档描述了在传递给ConcurrentHashMap.computeIfAbsent
和ConcurrentHashMap.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 。
(强调我的)