concurrenthashmap 採用自動調整大小的陣列鎖,是不是效率更高一點呢?
如果每個表項指向一個元素集(成為桶),則稱為封閉地址法。
2. 任何一個雜湊集演算法都要解決衝突問題:當兩個不同的元素雜湊到同一個表項時該如何處理。
開發地址演算法通常使用另外一個雜湊函式來檢測可替換的表項。封閉地址演算法則將衝突元素放在同一個桶中,直到這個桶變得太滿為止。
這兩種演算法都需要重新調整表的大小。在開放地址演算法中,表有可能變得太滿以致無法找到可替代的表項;
而封閉地址演算法中,桶油可能變得過大以致於無法進行有效的查詢。
3.封閉地址雜湊集
1. 考慮三種可替換使用的同步技術:
一種採用單一的粗粒度鎖;一種使用固定大小的鎖陣列;另一種使用大小可變的鎖陣列。
粗粒度雜湊集易於實現且很好理解。然而,這種雜湊集卻是一個順序瓶頸。如HashTable
固定大小的鎖陣列又稱為空間分帶雜湊集。
2. 細粒度雜湊集
如果要細化鎖的粒度,使得在一個分片裡的單元個數不會連續增長,應該怎麼做?
顯然,如果要調整鎖陣列的大小,需要另一種形式的同步。由於很少重新調整,所以我們的主要目標是
設計一種方法以允許鎖陣列大小被調整,同時又不會增加正常方法呼叫的代價。
concurrenthashmap 的原理是將集合劃為獨立同步的片,也就是空間分帶雜湊。
那麼問題來了,JDK為什麼不採用細粒度雜湊集?自動調整大小的陣列鎖,是不是效率更高一點呢?