2016-09-10 103 views
1

我一直在圍繞一個問題撓撓頭,現在我已經環顧四周,但未能找到答案。我想知道如果concurrencyLevel將大於地圖的capacity將會發生什麼。當concurrencyLevel大於ConcurrentHashMap的容量時會發生什麼?

默認情況下,這兩個值均爲16,表示每個存儲桶都有一個鎖。並且如果capacity將是32和concurrencyLevel 16將鎖定在2個桶上。但是當concurrencyLevel是32而capacity是16時會發生什麼?

是否每個存儲桶都由2個鎖持有,那麼如果concurrencyLevelcapacity的分配不均勻,如24和16或其他情況會發生什麼?

+0

有時我想SO有一個功能來標記你知道將有答案的人,讓你得到一個立即響應,功能類似Quora的,但更精緻,就像我可以標記已在帖子中發表評論的人員一樣。 – rd22

+0

這就是標籤的用途,以及評論中的@pings。 – EJP

+0

是啊!但是我可以在SO社區標記任何人,即使他們沒有評論這個問題嗎? @oleg會這樣工作嗎? – rd22

回答

5

沒有什麼特別的事情發生。你檢查了ConcurrentHashMap的文檔嗎?它說:「另外,爲了與此類的以前版本兼容,構造函數可以選擇指定一個預期的concurrencyLevel作爲內部尺寸的附加提示。」這是一個提示,而不是一個限制。此外在concurrencyLevel上:「估計同時更新的線程數量。該實現可以使用該值作爲大小提示。「注意:」可以「。所以如果發生任何事情,尺寸就會變得不同。也許。

如果你想要進一步的實現細節,你可以研究源代碼。它可用。在Java 1.8它contanis以下兩行:

if (initialCapacity < concurrencyLevel) // Use at least as many bins 
     initialCapacity = concurrencyLevel; // as estimated threads 
+0

這是有道理的,我從源頭上驗證它,但我在java 7中工作,並且在java 7中不清楚,他們使用了太多的內部變量。 Java 7會發生類似的情況嗎? – rd22

相關問題