ConcurrentHashMap 源码分析

ConcurrentHashMap 源码分析 1. 前言

   终于到这个类了,其实在前面很过很多次这个类,因为这个类代码量比较大,并且涉及到并发的问题,还有一点就是这个代码有些真的晦涩,不好懂。前前后后大概花了三天的时间看完的一些重要操作,接着今天来整理一下。

   好了首先介绍一个个人的感受:

首先这个类很多操作和 HashMap 是类似的,但是麻烦就麻烦在 锁分离技术 和 并发处理

底层还是采用的 数组 + 链表 + 红黑树 来实现的,但是红黑树的 TreeNode 改成了 TreeBin

里面有很多 CAS (Compare And Swap)操作,比如说 unsafe.compareAndSwapInt(this, valueOffset, expect, update)意思是如果 valueOffset 位置包含的值与 expect 值相同,则更新 valueOffset 位置的值为update,并返回true,否则不更新,返回false。

不仅仅是 CAS 还有一些重量级的锁。也就是 synchronized代码块 用来保证操作同一数组元素下的节点的一致性,后面会看到。

2. 基本结构 1. 继承

AbstractMap

2. 实现

ConcurrentMap

3. 属性 1. 基本属性

// 最大容量,同 hashmap private static final int MAXIMUM_CAPACITY = 1 << 30; // 默认大小 16 private static final int DEFAULT_CAPACITY = 16; // 数组的最大值 static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; // 并发数,不可修改 默认 16 private static final int DEFAULT_CONCURRENCY_LEVEL = 16; // 负载因子 0.75 private static final float LOAD_FACTOR = 0.75f; // 转成树链表最大长度 8 static final int TREEIFY_THRESHOLD = 8; // 转链表的节点数 static final int UNTREEIFY_THRESHOLD = 6; // 最小转换步长 16 常量不可修改 private static final int MIN_TRANSFER_STRIDE = 16; // private static int RESIZE_STAMP_BITS = 16; // 最大 transfer helper 数 默认 2^16-1 private static final int MAX_RESIZERS = (1 << (32 - RESIZE_STAMP_BITS)) - 1; // private static final int RESIZE_STAMP_SHIFT = 32 - RESIZE_STAMP_BITS; // 标志位 static final int MOVED = -1; // 正在 transfer 的节点的 hash 值 static final int TREEBIN = -2; // 树根的 hash 值 static final int RESERVED = -3; // 不进行序列化的 hash 值 // 可用 cpu 数 static final int NCPU = Runtime.getRuntime().availableProcessors(); // 底层的数组 注意是 volatile 的 transient volatile Node<K, V>[] table; // 在 resize 的时候使用的数组,只有在 resize 的时候才不是 null 一样volatile private transient volatile Node<K, V>[] nextTable; // 在没有竞争的时候使用,或者在初始化的时候作为一个反馈 private transient volatile long baseCount; // sizeCtl 是一个控制标志 // -1 表示初始化 // -N 表示有 N-1 个线程在 resize // 正数或0代表hash表还没有被初始化,这个数值表示初始化 // 大于 0 表示下一次进行扩容的时候的阈值 // 它的值始终是当前ConcurrentHashMap容量的0.75倍,这与loadfactor是对应的。 private transient volatile int sizeCtl;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxxsx.html