这是我原来的SO question的后续问题。

感谢该问题的答案,根据ConcurrentMap.computeIfPresent javadoc


  当多个线程时,默认实现可以重试这些步骤
  尝试更新,包括可能调用重新映射功能
  多次。


我的问题是:

当仅在多个线程之间共享ConcurrentHashMap.computeIfPresent时,remappingFunction是多次调用还是从单个线程创建并传递它时也可以多次调用它?

如果是后一种情况,为什么要多次调用而不是一次调用呢?

最佳答案

接口方法ConcurrentMap.computeIfPresent的常规协定允许实现在争用的情况下重复执行评估,而这正是ConcurrentMap继承default方法时发生的情况,因为不可能在常规接口在ConcurrentMap方法中。

但是,实现类default覆盖了此方法,并在its documentation中提供了保证:


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


重点矿

因此,由于您的问题专门要求ConcurrentHashMap,因此答案是,其参数函数永远不会得到多次求值。这不同于例如ConcurrentHashMap.computeIfPresent函数可能会被多次评估。

08-27 10:12