[英]Why do we need lock in the put methods of Hashtable/ConcurrentHashMap?
[英]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.