Java 在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中执行'mappingFunction'

Java 在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中执行'mappingFunction',java,multithreading,java-8,Java,Multithreading,Java 8,我试图查看实际的Java文档,这些文档描述了当传递到ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent方法时可以调用多少次mappingFunction的行为 ConcurrentHashMap.computeIfAbsent的Javadoc似乎非常清楚地指出,mappingFunction最多执行一次: ConcurrentHashMap.computeIfAbsent的Javadoc 如果指定的键尚未与值关

我试图查看实际的Java文档,这些文档描述了当传递到
ConcurrentHashMap.computeIfAbsent
ConcurrentHashMap.computeIfPresent
方法时可以调用多少次
mappingFunction
的行为

ConcurrentHashMap.computeIfAbsent
的Javadoc似乎非常清楚地指出,
mappingFunction
最多执行一次:

ConcurrentHashMap.computeIfAbsent的Javadoc

如果指定的键尚未与值关联,则尝试 使用给定的映射函数计算其值并输入 除非为null,否则将导入此映射。执行整个方法调用 原子上,因此每个键最多应用一次函数。一些 其他线程在此映射上尝试的更新操作可能会失败 正在进行计算时被阻止,因此应停止计算 简短且简单,并且不得尝试更新的任何其他映射 这张地图

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

ConcurrentHashMap.ComputeiPresent的Javadoc

如果指定键的值存在,则尝试计算 给定键及其当前映射值的新映射。整个 方法调用是以原子方式执行的。有人试图更新 其他线程在此映射上的操作可能会在 计算正在进行中,因此计算应简短且准确 简单,并且不得尝试更新此映射的任何其他映射

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

有这样的文档吗?

在的文档中,我们看到以下内容:

默认实现相当于为此映射执行以下步骤:

尽管文档中没有明确说明重新映射函数只执行一次,但文档中提供的等效代码清楚地说明了这一点

注意:请记住:

当多个线程尝试更新时,可能会多次调用映射操作和重新映射函数


(我的)

谢谢。但该代码只是用于记录实现如何使用
remappingFunction
,并且不是线程安全的,实际与
ConcurrentHashMap
中使用的代码大不相同,并且没有明确回答在实际的多线程实现中可能调用多少次
remappingFunction
。我不确定您是否看到了最新的编辑,但文档说明“当多个线程尝试更新时,映射操作和重映射函数可能会被多次调用。”是的,但这是来自实际文档还是您自己的意见。因为
computeifassent
更新了映射,但也保证了“重映射函数”“不会再被调用一次。它来自文档!阅读我答案中的链接。谢谢。这就是我要找的。这不是第一次文档中出现错误。。。
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;