我正在阅读这篇文章,以了解ConcurrentHashMap如何在内部工作。 https://dzone.com/articles/how-concurrenthashmap-works-internally-in-java
但我不明白在这里使用Segments。它是本文中的公开最终细分[]细分=新细分[32] 。 在我读这篇文章之前,我的理解是会有多个Entry表和&每个段都将保存多个数组中一个数组的引用。但在本文中只有一个
protected transient Entry[] table;
我的问题 -
1)以上单个阵列" 表"保留所有细分的条目?含义 - 如果我在ConcurrentHashMap中放入2个条目,它将返回2个不同的段,它是否仍然位于上面的相同条目表下?我很困惑,为什么上面定义的每个段都没有多个数组?
2)不能使用段并锁定它,当一个锁不能获得Entry对象并执行写/更新?
答案 0 :(得分:1)
这将是上面的单个阵列" table"保留所有细分的条目?
是
我很困惑,为什么上面定义的每个段都没有多个数组呢?
因为,Segment
对象实际上充当主entries
数组的段的锁。细分是概念性的"切片"主阵列。
而不是使用段并锁定它,当一个锁不能获得Entry对象并执行写/更新?
更新ConcurrentHashMap
的操作通常会读取和写入主entries
数组。简单地锁定一个Entry
不足以安全地执行表插入和删除。
如果该文章中的描述令人困惑,您还可以直接查看源代码;例如here
答案 1 :(得分:0)
自Java 8开始,并发哈希图中没有分段数组。它直接具有Node数组
答案 2 :(得分:0)
Java 8及更高版本,没有段数组,锁是在内部哈希表数组的特定哈希索引/存储桶的LinkedList的第一个节点上获取的。 ConcurrentHashMap internal