2013-04-07 30 views
3

我是新手到Java的世界,我在探索ConcurrentHashMap的API中,我發現了這一點:分割中的ConcurrentHashMap

static final int DEFAULT_INITIAL_CAPACITY = 16; 
    static final float DEFAULT_LOAD_FACTOR = 0.75F; 
    static final int DEFAULT_CONCURRENCY_LEVEL = 16; 
    static final int MAXIMUM_CAPACITY = 1073741824; 
    static final int MAX_SEGMENTS = 65536; 
    static final int RETRIES_BEFORE_LOCK = 2; 
    final Segment<K, V>[] segments; 
final Segment<K, V> segmentFor(int paramInt) 
    { 
    return this.segments[(paramInt >>> this.segmentShift & this.segmentMask)]; 
    } 

什麼是分割的ConcurrentHashMap的基本面,以及爲什麼使用它?請提供更多關於細分概念的建議。

回答

2

併發哈希映射將其內容劃分爲段,以減少寫入程序鎖爭用。

concurrencyLevel參數定義段的數量。默認情況下是16。在的ConcurrentHashMap

+0

完美的解釋,謝謝,你可以請指教一些鏈接,其中的圖或圖形它表明它是如何劃分的,這樣我可以掌握更多的 – 2013-04-07 03:58:01

+0

這裏有一個圖:HTTP:// javaopensourcecode .blogspot.com/2012/06/concurrenthashmap.html – jspcal 2013-04-07 04:01:12

+0

可以請你分享一些更多的網址,這樣數據結構部分將更加清晰。 – 2013-04-08 05:47:56

-1

分割可在以下的方式來定義:

考慮的ConcurrentHashMap爲包含各索引處小陣列和大陣列的每個索引稱爲段大陣列,並且每個段擔任HashMap中。在ConcurrentHashMap的默認分割爲16

訪問以下網址獲得的ConcurrentHashMap的更多信息:Internal working of ConcurrentHashMap

0

只需添加到其他偉大的答案,ConcurrentHashMap的分割地圖成若干段(基於併發創建映射時的級別集或16的默認併發級別)。

同一段內的併發讀取得到最近更新的值,讀取不需要鎖定並且不被阻塞。寫入不同的段可能會同時發生,但是,同一段中的兩次寫入可能會被阻塞。

更多在:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html