繁体   English   中英

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

[英]Why does concurrentHashMap need an array of Segment? Why cant it acquire lock on node?

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

但我不明白在这里使用Segments。 它是本文中的公共最终Segment [] segments = new Segment [32] 在我阅读本文之前,我的理解是会有多个Entry表,每个段都会保存多个数组的一个数组的引用。但在本文中只有一个

 protected transient Entry[] table; 

我的问题 -

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

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

上面的单个数组“表”是否包含所有段的条目?

是。

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

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

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

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


如果该文章中的描述令人困惑,您还可以直接查看源代码; 例如http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/concurrent/ConcurrentHashMap.java/

自java 8以后,concurrenthashmap中没有任何段数组。 它直接有Node数组

Java 8以后没有段数组,在内部哈希表数组的特定散列索引/存储桶的LinkedList的第一个节点上获取锁 ConcurrentHashMap内部

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM