java - 需要简单解释 "lock striping"如何与 ConcurrentHashMap 一起工作

标签 java concurrency java.util.concurrent concurrenthashmap

根据 Java Concurrency in Practice,第 11.4.3 章说:

Lock splitting can sometimes be extended to partition locking on a variablesized set of independent objects, in which case it is called lock striping. For example, the implementation of ConcurrentHashMap uses an array of 16 locks, each of which guards 1/16 of the hash buckets; bucket N is guarded by lock N mod 16.

我在理解和可视化锁 strip 化和存储桶机制方面仍然存在问题。 有人可以用很好理解的话来解释这个:)

提前致谢。

最佳答案

HashMap 建立在一个数组上,其中哈希函数将一个对象映射到底层数组中的一个元素。假设底层数组有 1024 个元素 - ConcurrentHashMap 实际上把它变成了 16 个不同的 64 个元素的子数组,例如{0, 63}, {64, 127} 等。每个子数组都有自己的锁,因此修改 {0, 63} 子数组不会影响 {64, 127} 子数组 - 一个线程可以写入第一个子数组,而另一个线程写入第二个子数组。

关于java - 需要简单解释 "lock striping"如何与 ConcurrentHashMap 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16151606/

相关文章:

java - 如何旋转对象使其始终面向鼠标?

java - 将行插入数据库后 JTable 不更新

loops - 在嵌套 for 循环中使用并发? (蛮力)

java - 如何使用 runAsync 等待完整的 future 完全完成?

java - X-FORWARDED-FOR 将给出确切的客户端 IP 或 NAT 给出的 IP

java - 如何设置评分栏的星形颜色?

java - 如何在java中使用TimeUnit

Java同步线程

java - 如何实现用于流式传输斐波那契数的 Spliterator?

c# - Thread.Yield 是确定多线程应用程序 C# 中是否存在错误的标准方法吗