共同學習Java原始碼-多執行緒與併發-ConcurrentHashMap(一)
ConcurrentHashMap是每個Java學習者必看的類
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable
這個類繼承了AbstractMap 類 實現了ConcurrentMap、Serializable介面
private static final int MAXIMUM_CAPACITY = 1 << 30;
這個是最大陣列容量 2的30次方個
private static final int DEFAULT_CAPACITY = 16;
這個是預設陣列容量 16個
static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
推測一下 因為後面的程式碼沒看到 這個應該是ConcurrentHashMap所有陣列元素數之和的最大值 為2的31次方減8
private static final int DEFAULT_CONCURRENCY_LEVEL = 16;
這個是預設併發級別 這個屬性目前應該是沒用了 為了和之前的版本相容 1.8之後這個類的原始碼改動很大 放棄了Segment陣列 變成了連結串列的形式
private static final float LOAD_FACTOR = 0.75f;
陣列擴容的閾值 達到容量75%時 陣列擴容
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
連結串列轉換成樹 以及 樹轉換回連結串列的兩個閾值
static final int MIN_TREEIFY_CAPACITY = 64;
將連結串列轉換成樹的時候 陣列的最小容量
private static final int MIN_TRANSFER_STRIDE = 16;
猜測是每次陣列擴容的時候 每一步轉換的陣列元素數 因為ConcurrentHashMap在1.8中變成和HashMap很類似的儲存結構 就是陣列+連結串列/紅黑樹 但是ConcurrentHashMap是多執行緒操作 所以每次不操作全部元素
private static int RESIZE_STAMP_BITS = 16;
這個是陣列擴容時的移位標記
private static final int MAX_RESIZERS = (1 << (32 - RESIZE_STAMP_BITS)) - 1;
這個是容量變化時最大操作執行緒數 就是2的16次方減一個
private static final int RESIZE_STAMP_SHIFT = 32 - RESIZE_STAMP_BITS;
擴容移位標記的移位數 32-16=16
static final int MOVED = -1;
ForwardingNode的雜湊值 這個節點就是在陣列容量變化時 插在陣列最開頭的節點
static final int TREEBIN = -2;
紅黑樹根節點的雜湊值
static final int RESERVED = -3;
computeIfAbsent方法呼叫時產生的節點的雜湊值 目前本人不講解lambda表示式相關方法
static final int HASH_BITS = 0x7fffffff;
常規節點雜湊運算標誌位
static final int NCPU = Runtime.getRuntime().availableProcessors();
這個是CPU數