为什么concurrentHashMap需要一个Segment数组?为什么它无法在节点上获得锁定?

时间:2018-04-15 04:37:50

标签: java data-structures concurrency java.util.concurrent concurrenthashmap

我正在阅读这篇文章,以了解ConcurrentHashMap如何在内部工作。 https://dzone.com/articles/how-concurrenthashmap-works-internally-in-java

但我不明白在这里使用Segments。它是本文中的公开最终细分[]细分=新细分[32] 。 在我读这篇文章之前,我的理解是会有多个Entry表和&每个段都将保存多个数组中一个数组的引用。但在本文中只有一个

 protected transient Entry[] table; 

我的问题 -

1)以上单个阵列" "保留所有细分的条目?含义 - 如果我在ConcurrentHashMap中放入2个条目,它将返回2个不同的段,它是否仍然位于上面的相同条目表下?我很困惑,为什么上面定义的每个段都没有多个数组?

2)不能使用段并锁定它,当一个锁不能获得Entry对象并执行写/更新?

3 个答案:

答案 0 :(得分:1)

  

这将是上面的单个阵列" table"保留所有细分的条目?

  

我很困惑,为什么上面定义的每个段都没有多个数组呢?

因为,Segment对象实际上充当主entries数组的段的锁。细分是概念性的"切片"主阵列。

  

而不是使用段并锁定它,当一个锁不能获得Entry对象并执行写/更新?

更新ConcurrentHashMap的操作通常会读取和写入主entries数组。简单地锁定一个Entry不足以安全地执行表插入和删除。

如果该文章中的描述令人困惑,您还可以直接查看源代码;例如here

答案 1 :(得分:0)

自Java 8开始,并发哈希图中没有分段数组。它直接具有Node数组

答案 2 :(得分:0)

Java 8及更高版本,没有段数组,锁是在内部哈希表数组的特定哈希索引/存储桶的LinkedList的第一个节点上获取的。 ConcurrentHashMap internal