最近面試比較多,ConcurrentHashMap問得也比較多。
因此總結了一些關於ConcurrentHashMap的基礎知識
Key 和 Value 不能爲空
Value 不爲空是因爲刪除和替換走相同的邏輯。
value爲空,是刪除該節點,需要計算器-1,不爲空則是替換該節點的val值。
tab 大小爲 pow of 2
Node 類型
存儲Node的hash非負數
static final int spread(int h) {
return (h ^ (h >>> 16)) & HASH_BITS;
}
HASH_BITS 的作用,最高bit位變爲0.
TreeNode 存儲Node
static final int MOVED = -1; // hash for forwarding nodes static final int TREEBIN = -2; // hash for roots of trees static final int RESERVED = -3; // hash for transient reservations
Double-Check
先檢測f是否爲null,不爲空鎖f,再次檢測 tab[i] 是否等於f 。 場景:frist節點(頭節點)被刪除,tab[i]就會發生變化。
關鍵字final與volatile
volatile能解釋 爲啥讀線程遍歷單向鏈表無需加鎖,
更新val,保證讀線程可見
尾部插入新數據,保證讀線程可見。
final int hash; final K key; volatile V val; volatile Node<K,V> next;
計數器 LongAdder
遍歷順序和擴容順序相反
Simple read write lock
擴容時機,
懶初始化,第一次添加纔會new tab[16]
n<64 , 但是鏈表的數量達到了8,也會觸發擴容
達到sizeCtl觸發擴容
擴容做法(一條鏈拆分爲兩條鏈)
resizeStamp 應該不會有問的