首页 > 解决方案 > ConcurrentHashMap 的 compute、computeIfAbsent 和 computeIfPresent 方法是完全原子的吗?

问题描述

整个方法调用是原子的还是只是 BiFunction 执行原子的?它是阻止所有键还是仅阻止同一键上的调用?

标签: javaconcurrencythread-safetyatomicconcurrenthashmap

解决方案


以下详细信息适用于 OpenJDK Java 11。

Node这三个方法在调用方法并更新键/值时对映射中的a 进行锁定。该节点通常是散列桶的节点链或节点树中的第一个节点。在同一个桶中插入、更新或删除键/值对的并发尝试将被阻止,直到锁被释放。

(其他版本的 Java 的行为可能会有所不同。)


整个方法调用是原子的还是只是 BiFunction 执行原子的?

整个方法调用。

它是阻止所有键还是仅阻止同一键上的调用?

中间某个地方; 看上面。但是,如果您遵循javadocs中的此建议,则无关紧要。

“在计算过程中,其他线程在此映射上的一些尝试更新操作可能会被阻止,因此计算应该简短而简单......”


推荐阅读