- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我原来的 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
方法时发生的情况,因为不可能在通用 之上提供原子性
接口(interface)。default
方法中的 >ConcurrentMap
但是,实现类 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/
computeIfPresent 是 java.util.Map 的默认方法,已在 Java 8 中引入。computeIfPresent 方法为给定键及其关联值计算指定的Map函数,然后更新该键的值
假设我有一个以集合作为值的并发映射: Map map = new ConcurrentHashMap<>(); map.putIfAbsent(8, new ArrayList<>()); 然后我按如
我正在尝试制作具有以下功能的工厂: 它应该总是返回一个 Filter 对象。 从 hashmap = 如果字符串字母(键)已经存在于 hashmap 中,它应该只从 hashmap 中获取它的值(对象
我有一组非常适合我的代码: for (String word : distinctWordsInOneLigne) { Map> map = new H
我有以下代码: for (String val: values) { EnumType type = EnumType.get(val); if (type != null) {
这是我原来的 SO question 的跟进问题. 感谢这个问题的答案,根据 ConcurrentMap.computeIfPresent javadoc 看起来是这样的 The default im
workObjectMap.computeIfPresent(key, (k,v) -> { v.memberIdSet.addAll(memberIdSet); v.memberPo
我正在使用 Java 8,想知道 ConcurrentHashMap 的 computeIfPresent 操作是否锁定了整个表/映射或仅锁定包含 key 的 bin。 来自documentation
我用过计算方法和合并方法。但是我仍然不确定合并方法与计算方法有何不同。 我在采访中被问到一个问题,以维护给定 IP 地址列表的命中计数器。这是 Map 的基本实现,其中键是 IP,值是命中数。 我用
我有这段代码: if (notificationSend.get(key) != null && notificationSend.get(key).equals(value)) { retur
jdk 8新版Concurrent Hash Map新增了两个Method。 computeIfAbsent computeIfPresent putIfAbsent - 旧方法 我了解 putIfA
当尝试使用 computeIfPresent() 方法更改 map 时,我在使用 innerMap 时遇到了实现此方法的问题。 这个有效: Map mapOne = new HashMap<>();
我正在尝试查看实际的 Java 文档,描述传递给 ConcurrentHashMap.computeIfAbsent 和 ConcurrentHashMap.computeIfPresent< 时可以
我是一名优秀的程序员,十分优秀!