ConcurrentHashMap是每个Java学习者必看的类
public class ConcurrentHashMap
这个类继承了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数