1. 程式人生 > >共同學習Java原始碼-多執行緒與併發-ConcurrentHashMap(一)

共同學習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數