【发布时间】:2017-06-14 10:58:05
【问题描述】:
我正在使用 Java 8,想知道 ConcurrentHashMap 的 computeIfPresent 操作是否锁定了整个表/映射或只锁定了包含密钥的 bin。
来自computeIfPresent方法的documentation:
其他线程在此映射上的某些尝试更新操作可能会在计算过程中被阻塞,因此计算应该简短而简单,并且不得尝试更新此映射的任何其他映射
当为一个键调用这个方法时,看起来整个地图都被锁定了。如果某个键的值被更新,为什么必须锁定整个地图?锁定包含键/值对的 bin 不是更好吗?
【问题讨论】:
-
是的,根据我的解释,您也阻止了其他尝试调用此方法的线程。锁用于保护您的数据结构免受数据损坏和多个线程试图修改数据结构的不良影响。从文档中还说,此方法的作用是重新计算键及其关联值的新映射。这意味着这个操作可能会修改数据结构的各个部分(因为需要找到一个新的“桶”),这可能就是你需要锁定其他线程的原因。
标签: java multithreading java.util.concurrent concurrenthashmap