簡體   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