簡體   English   中英

java ConcurrentHashMap中的segmentMask是什么意思

[英]What does segmentMask mean in java ConcurrentHashMap

我覺得

(hash >>> segmentShift) & segmentMask

等於

(hash >>> segmentShift)

例如,ssize 是 16,sshift 是 4,所以 segmentShift 是 28,segmentMask 是 15

hash >>> segmentShift

將獲得高 4 位,當使用 segmentMask 執行和操作時,沒有任何改變。

我有什么誤解?

好吧,我從這里了解到的是整個操作

(hash >>> segmentShift) & segmentMask

用於查找表中段的位置。 正如您已經提到的, (hash >>> segmentShift) 用於獲取密鑰哈希的前 4 位。

但段掩碼的主要工作是在段表數組中平均分配段。 ConcurrentHashMap 中有很多段,所以為了避免沖突,使用了這個段掩碼。 並且段掩碼是[(2的冪)-1]。

這個概念類似於 HashMap,其中 [hash & (length_of_hashmap-1)] 用於在 hashmap 中查找鍵的索引。

hashmap 的長度總是 2 的冪,在這種情況下,segmentmask 也是(2 的冪)-1。

它適用於 hashmap%size of hashmap 的相同概念,因此索引不會超出 hahsmap 的長度。

非常正確!但有一個例外。

        int sshift = 0;
        int ssize = 1;
        while (ssize < concurrencyLevel) {
            ++sshift;
            ssize <<= 1;
        }
        segmentShift = 32 - sshift;
        segmentMask = ssize - 1; 

當 concurrentLevel 為 1 時,segmentShift 為 32,segmentMask 為 0。 (hash >>> 32) = hash ,越過段數組的限制,那么你需要 segmentMask 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM