这是我原来的SO question的后续问题。
感谢该问题的答案,根据ConcurrentMap.computeIfPresent
javadoc
当多个线程时,默认实现可以重试这些步骤
尝试更新,包括可能调用重新映射功能
多次。
我的问题是:
当仅在多个线程之间共享ConcurrentHashMap.computeIfPresent
时,remappingFunction
是多次调用还是从单个线程创建并传递它时也可以多次调用它?
如果是后一种情况,为什么要多次调用而不是一次调用呢?
最佳答案
接口方法ConcurrentMap.computeIfPresent
的常规协定允许实现在争用的情况下重复执行评估,而这正是ConcurrentMap
继承default
方法时发生的情况,因为不可能在常规接口在ConcurrentMap
方法中。
但是,实现类default
覆盖了此方法,并在its documentation中提供了保证:
如果存在指定键的值,请尝试在给定键及其当前映射值的情况下计算新映射。整个方法调用是原子执行的。在进行计算时,可能会阻止其他线程在此映射上进行的某些尝试的更新操作,因此计算应简短而简单,并且不得尝试更新此映射的任何其他映射。
重点矿
因此,由于您的问题专门要求ConcurrentHashMap
,因此答案是,其参数函数永远不会得到多次求值。这不同于例如ConcurrentHashMap.computeIfPresent
函数可能会被多次评估。