關於ConcurrentHashMap知識點總結

最近面試比較多,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 應該不會有問的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章