首页 > 解决方案 > ConcurrentHashMap中Bucket级锁和段级锁的区别?

问题描述

我浏览了以下链接和一些在线视频教程,但无法在 ConcurrentHashMap 中找到 Bucket 级别锁定和段级别锁定之间的确切区别。

并发哈希映射

标签: javaconcurrency

解决方案


在 Java 8ConcurrentHashMap中,将其逻辑更改为使用存储桶级锁而不是段级锁。

有什么区别?

在 Java 7 中,映射被细分为 Segments,每个 Segments 本身都是一个并发可读的哈希表。每个段内部都包含一些桶。

存储桶本身是键值对的列表/数组。

并行使用 map 的线程数受限于段数。

在 Java 8 中,锁级别被移动到存储桶级别,而段被删除(它仍在代码中,但没有使用)。

所以,基本上,在 Java 7 中插入是锁定几个桶,在 Java 8 中 - 只有一个。

这样做的另一个原因是,与映射并行工作的线程数量可以在映射大小增加期间增加(更多桶 - 更多线程)。在 Java 7 中,段大小是固定的,如果不重新创建地图就无法更改。


推荐阅读