共同学习Java源代码-多线程与并发-ConcurrentHashMap(一)

ConcurrentHashMap是每个Java学习者必看的类

public class ConcurrentHashMap extends AbstractMap implements ConcurrentMap, 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数







你可能感兴趣的:(Java)