ConcurrentHashMap 的compute、computeIfAbsent 和computeIfPresent 方法完全是原子的吗?

Ale*_*Sim 5 java concurrency atomic thread-safety concurrenthashmap

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

Ste*_*n C 4

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

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

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


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

整个方法调用。

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

中间某个地方; 往上看。但如果您遵循javadocs中的建议,那就没什么问题了。

“当计算正在进行时,其他线程在此地图上尝试的一些更新操作可能会被阻止,因此计算应该简短......”