ConcurrentHashMap锁定

时间:2012-05-14 18:37:27

标签: java concurrenthashmap

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

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

在阅读Map时,它是否正确,但是在更新它时只使用了锁定?

3 个答案:

答案 0 :(得分:14)

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

在特定细分中设置数据时,会获取该细分的锁定。

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:1)

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

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

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