tab变量是HashMap的数组, 数组长度为null,或者数组的长度为0

110 阅读3分钟
/* sizeCtl = -1:说明当前ConcurrentHashMap正在初始化!!! 
sizeCtl = -N:说明当前ConcurrentHashMap正在扩容!!! 
sizeCtl = 0:默认初始值,当前ConcurrentHashMap还没有初始化 
sizeCtl > 0:如果已经初始化过了,sizeCtl标识扩容的阈值, 如果没有初始化,sizeCtl标识数组的初始化容量 */

private final Node<K,V>[] initTable() {
    // 声明一些变量
    Node<K,V>[] tab; int sc;
    // tab变量是HashMap的数组, 数组长度为null,或者数组的长度为0,说明数组还没有初始化!
    while ((tab = table) == null || tab.length == 0) {
        // 将sizeCtl赋值给sc,如果进到if中,说明正在扩容或者正在初始化
        if ((sc = sizeCtl) < 0)
            Thread.yield(); // lost initialization race; just spin
            
        // 以CAS的方式,尝试将sizeCtl从之前oldValue替换为-1,为了标识我当前ConcurrentHashMap正在初始化
        else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) {
            // 开始扩容
            try {
                //DCL思想
                // table是不是还是null,或者长度还是0
                if ((tab = table) == null || tab.length == 0) {
                    // 声明n,sc是sizeCtl,默认sizectl为0,但是现在正在初始化,我把sizeCtl改为了-1,但是sc还是0 ```
    Node<K,V> b; int n, sc;
    if (tab != null) {
        // MIN_TREEIFY_CAPACITY 为 64
        // 所以,如果数组长度小于 64 的时候,其实也就是 32 或者 16 或者更小的时候,会进行数组扩容
        if ((n = tab.length) < MIN_TREEIFY_CAPACITY)
            // 后面我们再详细分析这个方法
            tryPresize(n << 1);
        // b 是头节点
        else if ((b = tabAt(tab, index)) != null && b.hash >= 0) {
            // 加锁
            synchronized (b) {

                if (tabAt(tab, index) == b) {
                    // 下面就是遍历链表,建立一颗红黑树
                    TreeNode<K,V> hd = null, tl = null;
                    for (Node<K,V> e = b; e != null; e = e.next) {
                        TreeNode<K,V> p =
                // sc如果为0,不大于0,所以为DEFAULT_CAPACITY,16
                int n = (sc > 0) ? sc : DEFAULT_CAPACITY;
                @SuppressWarnings("unchecked")
                // 创建数组!!!
                Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n];
                // 将初始化的nt数组赋值给ConcurrentHashMap的table
                table = tab = nt;
                // 默认sc = 12,为扩容阈值```
Node<K,V> b; int n, sc;
if (tab != null) {
    // MIN_TREEIFY_CAPACITY 为 64
    // 所以,如果数组长度小于 64 的时候,其实也就是 32 或者 16 或者更小的时候,会进行数组扩容
    if ((n = tab.length) < MIN_TREEIFY_CAPACITY)
        // 后面我们再详细分析这个方法
        tryPresize(n << 1);
    // b 是头节点
    else if ((b = tabAt(tab, index)) != null && b.hash >= 0) {
        // 加锁
        synchronized (b) {

            if (tabAt(tab, index) == b) {
                // 下面就是遍历链表,建立一颗红黑树
                TreeNode<K,V> hd = null, tl = null;
                for (Node<K,V> e = b; e != null; e = e.next) {
                    TreeNode<K,V> p =
                    sc = n - (n >>> 2);
                }
            } finally {
                // 将阈值赋值给sizeCtl,到这初始化完毕
                sizeCtl = sc;
            }
            break;
        }
    }
    return tab;
    Node<K,V> b; int n, sc;
    if (tab != null) {
        // MIN_TREEIFY_CAPACITY 为 64
        // 所以,如果数组长度小于 64 的时候,其实也就是 32 或者 16 或者更小的时候,会进行数组扩容
        if ((n = tab.length) < MIN_TREEIFY_CAPACITY)
            // 后面我们再详细分析这个方法
            tryPresize(n << 1);
        // b 是头节点
        else if ((b = tabAt(tab, index)) != null && b.hash >= 0) {
            // 加锁
            synchronized (b) {

                if (tabAt(tab, index) == b) {
                    // 下面就是遍历链表,建立一颗红黑树
                    TreeNode<K,V> hd = null, tl = null;
                    for (Node<K,V> e = b; e != null; e = e.next) {
     
https://www.laipuhuo.com/goodsDetail/01EC88F9739A464B9CBAC6F5B3F1A8CC.html
https://www.laipuhuo.com/goodsDetail/01ed3b6143214668897d8af195325e77.html
https://www.laipuhuo.com/goodsDetail/01f2a21598e9457a8d966206df135bc2.htm
https://www.laipuhuo.com/goodsDetail/01f35571a1b644fca099b8a763fae3e1.html
https://www.laipuhuo.com/goodsDetail/01f8c6d04632430daf9771f855ab42e9.html

https://www.laipuhuo.com/goodsDetail/01FAA7E8E45C4F4B88D552DF96A78567.html
https://www.laipuhuo.com/goodsDetail/01fb9363baf34012b0a88261dc04719b.html
    Node<K,V> b; int n, sc;
    if (tab != null) {
        // MIN_TREEIFY_CAPACITY 为 64
        // 所以,如果数组长度小于 64 的时候,其实也就是 32 或者 16 或者更小的时候,会进行数组扩容
        if ((n = tab.length) < MIN_TREEIFY_CAPACITY)
            // 后面我们再详细分析这个方法
            tryPresize(n << 1);
        // b 是头节点
        else if ((b = tabAt(tab, index)) != null && b.hash >= 0) {
            // 加锁
            synchronized (b) {

                if (tabAt(tab, index) == b) {
                    // 下面就是遍历链表,建立一颗红黑树
                    TreeNode<K,V> hd = null, tl = null;
                    for (Node<K,V> e = b; e != null; e = e.next) {
                        TreeNode<K,V> p =
```