18

我在某处读到ConcurrentHashMap,整个地图对象没有被锁定,而是在地图的一部分上进行了锁定。

有人可以详细说明锁定何时出现吗?

在阅读地图时没有涉及锁定但在更新它时只使用锁定是对的吗?

4

3 回答 3

22

是的,ConcurrentHashMap使用多个锁(默认情况下,其中 16 个),每个锁控制哈希的一个段。

在特定段中设置数据时,将获得该段的锁定。

获取数据时,使用易失性读取。如果易失性读取导致未命中,则在最后一次尝试成功读取时获得该段的锁定。

于 2012-05-14T18:43:23.137 回答
7

锁定尽可能地最小化,同时仍然是线程安全的。

解释“部分 Map 被锁定”,这意味着在更新时,只有 Map 的“1/concurrencyLevel”(基于 key 的哈希)被锁定。这意味着如果两个更新都影响单独的“桶”,两个更新仍然可以同时安全地执行,从而最大限度地减少锁争用,从而最大限度地提高性能。

更重要的是,相信 JDK 实现——您不必担心 JDK 中的实现细节(一方面,它可能会随着版本的不同而变化)。相反,只需专注于编写代码

于 2012-05-14T18:41:45.290 回答
1

ConcurrentHashMap 使用可重入锁机制。ConcurrentHashMap 使用段而不是存储桶,当新记录获取插入锁时,将仅在段而不是完整的段列表上获取。所以这里的想法清楚地表明多级锁将在同一时间获得。

由于没有明确设置并发级别,因此 ConcurrentHashMap 被分为 16 个段。并且每个段都充当一个独立的 HashMap。

ConcurrentHashMap 中的读取操作没有应用锁。

于 2017-12-29T10:15:31.983 回答