ConcurrentHashMap锁定
我在某地读过,在ConcurrentHashMap
,整个地图对象没有被锁定,而是在Map的一部分上进行锁定。
有人可以详细说明何时锁定进入图片?
是不是在读取Map时没有锁定,但在更新时只使用锁定?
是的, ConcurrentHashMap
使用多个锁(默认情况下,其中16个),每个锁控制一个哈希段。
在特定段中设置数据时,将获取该段的锁定。
获取数据时,使用易失性读取。 如果易失性读取导致未命中,则获得该段的锁定以用于成功读取的最后一次尝试。
锁定尽可能地最小化,同时仍然是线程安全的。
为了解释“部分地图被锁定”,这意味着在更新时,仅锁定地图的“1 / concurrencyLevel”(基于密钥的散列)。 这意味着如果两个更新各自影响单独的“存储桶”,则它们仍可以同时安全地执行,从而最大限度地减少锁争用,从而最大限度地提高性能。
更重要的是,相信JDK实现 – 您不必担心JDK中的实现细节(一方面,它可能会在发行版之间发生变化)。 相反,只关注编写代码。
ConcurrentHashMap使用Reentrant Lock机制。 ConcurrentHashMap使用段而不是存储桶,当新记录获取插入锁定时,将只获取段而不是完整的段列表。 所以这里的想法清楚地表明,多级锁定将获得同样的收益。
由于没有设置并发级别,因此ConcurrentHashMap被分为16个段。 每个段都充当独立的HashMap。
ConcurrentHashMap中的读取操作没有应用锁定。
- 在ConcurrentHashMap中修改值的首选方法是什么?
- 使用ConcurrentHashMap消除了数据可见性问题?
- ThreadLocal HashMap vs ConcurrentHashMap用于线程安全的未绑定缓存
- 如何使用LinkedHashMap中的类似function实现ConcurrentHashMap?
- “在Java 8中构建时,未定义的引用:.. ConcurrentHashMap.keySet()”
- 使用java ConcurrentHashMap实现缓存
- 在Java ConcurrentHashMap中打印所有键/值对
- 最快的方法来初始化ConcurrentHashMap的值
- ConcurrentHashMap.get()是否保证通过不同的线程看到以前的ConcurrentHashMap.put()?