Java 在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中执行'mappingFunction'
我试图查看实际的Java文档,这些文档描述了当传递到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 如果指定的键尚未与值关
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;