gpt4 book ai didi

java - 在 ConcurrentHashMap.computeIfPresent 中执行 `remappingFunction`

转载 作者:行者123 更新时间:2023-11-29 09:59:02 28 4
gpt4 key购买 nike

这是我原来的 SO question 的跟进问题.

感谢这个问题的答案,根据 ConcurrentMap.computeIfPresent javadoc 看起来是这样的

The default implementation may retry these steps when multiple threads attempt updates including potentially calling the remapping function multiple times.

我的问题是:

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

如果是后一种情况,为什么它会被调用多次而不是一次?

最佳答案

接口(interface)方法的总契约 ConcurrentMap.computeIfPresent允许实现在发生争用的情况下重复评估,这正是 ConcurrentMap 继承 default 方法时发生的情况,因为不可能在通用 之上提供原子性default 方法中的 >ConcurrentMap 接口(interface)。

但是,实现类 ConcurrentHashMap 覆盖了这个方法并在its documentation 中提供了保证。 :

If the value for the specified key is present, attempts to compute a new mapping given the key and its current mapped value. The entire method invocation is performed atomically. Some attempted update operations on this map by other threads may be blocked while computation is in progress, so the computation should be short and simple, and must not attempt to update any other mappings of this map.

强调我的

因此,由于您的问题具体要求 ConcurrentHashMap.computeIfPresent,因此答案是,它的参数函数永远不会被多次求值。这不同于,例如ConcurrentSkipListMap.computeIfPresent 函数可能会被计算多次。

关于java - 在 ConcurrentHashMap.computeIfPresent 中执行 `remappingFunction`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48628649/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com