ConcurrentHashMap锁定

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

有人可以详细说明何时锁定进入图片?

是不是在读取Map时没有锁定,但在更新时只使用锁定?

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

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

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

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

为了解释“部分地图被锁定”,这意味着在更新时,仅锁定地图的“1 / concurrencyLevel”(基于密钥的散列)。 这意味着如果两个更新各自影响单独的“存储桶”,则它们仍可以同时安全地执行,从而最大限度地减少锁争用,从而最大限度地提高性能。

更重要的是,相信JDK实现 – 您不必担心JDK中的实现细节(一方面,它可能会在发行版之间发生变化)。 相反,只关注编写代码。

ConcurrentHashMap使用Reentrant Lock机制。 ConcurrentHashMap使用段而不是存储桶,当新记录获取插入锁定时,将只获取段而不是完整的段列表。 所以这里的想法清楚地表明,多级锁定将获得同样的收益。

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

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