我已经在ConcurrentHashMap
的某处读过,整个地图对象没有被锁定,而是在地图的一部分上进行锁定。
有人可以详细说明何时锁定进入图片?
在阅读Map时,它是否正确,但是在更新它时只使用了锁定?
答案 0 :(得分:14)
是的,ConcurrentHashMap
使用多个锁(默认情况下,其中16个),每个锁控制一个哈希段。
在特定细分中设置数据时,会获取该细分的锁定。
获取数据时,使用易失性读取。如果易失性读取导致未命中,则获取该段的锁定,以便在成功读取时进行最后一次尝试。
答案 1 :(得分:6)
锁定尽可能地最小化,同时仍然是线程安全的。
要解释"地图的一部分被锁定",这意味着在更新时,只有" 1 / concurrencyLevel"地图(基于密钥的哈希)被锁定。这意味着,如果两个更新各自影响单独的“桶”,则可以安全地同时执行,从而最大限度地减少锁争用,从而最大限度地提高性能。
更重要的是,相信JDK实现 - 您不必担心JDK中的实现细节(一方面,它可能会在发行版之间发生变化)。相反,只需专注于编写您的代码。
答案 2 :(得分:1)
ConcurrentHashMap使用Reentrant Lock机制。 ConcurrentHashMap使用段而不是存储桶,当新记录获取插入锁定时,将只获取段而不是完整的段列表。所以这里的想法清楚地表明,多级锁定将获得同样的收购。
由于没有设置并发级别的explictity,ConcurrentHashMap被分为16个段。每个段都充当独立的HashMap。
ConcurrentHashMap中的读操作没有应用锁。