用于computeIfPresent的Java锁定机制中的ConcurrentHashMap

我正在使用
Java 8,并且想知道ConcurrentHashMap的computeIfPresent操作是否确实锁定了整个表/映射或仅包含密钥的bin.

从computeIfPresent方法的documentation

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

这看起来在为键调用此方法时锁定了整个映射.为什么在更新某个键的值时必须锁定整个地图?锁定包含键/值对的bin是不是更好?

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

点赞