![](/img/trans.png)
[英]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.