我在某处读到过,在ConcurrentHashMap中,整个地图对象没有被锁定,而是在地图的一部分上进行了锁定。
有人能详细说明一下锁定是什么时候出现的吗?
在读取地图时不涉及锁定,但在更新地图时只使用锁定,这是正确的吗?
发布于 2012-05-15 02:43:23
是的,ConcurrentHashMap使用了许多锁(默认情况下,有16个锁),每个锁控制散列的一个段。
在特定段中设置数据时,将获得该段的锁。
当获取数据时,使用易失性读取。如果易失性读取导致未命中,则在最后一次尝试成功读取时将获得该段的锁。
发布于 2012-05-15 02:41:45
锁被尽可能地最小化,同时仍然是线程安全的。
为了解释“Map的一部分被锁定”,这意味着当更新时,只有Map的"1/concurrencyLevel“(基于密钥的散列)被锁定。这意味着,如果两个更新分别影响单独的“存储桶”,则它们仍然可以同时安全地执行,从而最小化锁争用,从而最大化性能。
更重要的是,信任JDK实现--您不必担心JDK中的实现细节(首先,它可能在不同的版本中有所不同)。相反,只要专注于编写代码即可。
发布于 2017-12-29 18:15:32
ConcurrentHashMap使用重入锁机制。ConcurrentHashMap使用段而不是存储桶,当新记录get insert时,锁将只在段上获取,而不是在段的完整列表上获取。因此,这里的想法清楚地表明,多级锁将在相同的条件下获得。
由于没有明确设置并发级别,因此ConcurrentHashMap被划分为16个段。并且每个段都充当独立的HashMap。
在ConcurrentHashMap中没有对读取操作应用锁定。
https://stackoverflow.com/questions/10589103
复制相似问题