Java 锁定机制中的 ConcurrentHashMap 用于computeIfPresent

Sve*_*ach 5 java multithreading concurrenthashmap java.util.concurrent

我正在使用 Java 8 并想知道computeIfPresent操作是ConcurrentHashMap锁定整个表/地图还是仅锁定包含密钥的 bin。

从该方法的文档computeIfPresent

其他线程在此映射上尝试的一些更新操作可能会在计算过程中被阻塞,因此计算应该简短且简单,并且不得尝试更新此映射的任何其他映射

当为一个键调用这个方法时,这看起来整个地图都被锁定了。如果更新某个键的值,为什么必须锁定整个地图?锁定包含键/值对的 bin 不是更好吗?

kor*_*lar 2

从实现来看(Oracle JDK 1.8.0_101),只是相应的bin被锁定。这与您引用的文档片段并不矛盾,因为它提到某些更新操作可能会被阻止,但不一定是全部。当然,如果文档明确说明了什么被锁定,那就更清楚了,但这会泄露实现细节,而这实际上是接口的一部分。