ConcurrentHashMap之helpTransfer()协助扩容方法源码分解

   /**
    * Helps transfer if a resize is in progress.
    */
   final Node<K,V>[] helpTransfer(Node<K,V>[] tab, Node<K,V> f) {
       //nextTab 引用的是 fwd.nextTable == map.nextTable 理论上是这样。
       //sc 保存map.sizeCtl
       Node<K,V>[] nextTab; int sc;

       //条件一:tab != null 恒成立 true
       //条件二:(f instanceof ForwardingNode) 恒成立 true
       //条件三:((ForwardingNode<K,V>)f).nextTable) != null 恒成立 true
       if (tab != null && (f instanceof ForwardingNode) &&
           (nextTab = ((ForwardingNode<K,V>)f).nextTable) != null) {

           //拿当前标的长度 获取 扩容标识戳   假设 16 -> 32 扩容:1000 0000 0001 1011
           int rs = resizeStamp(tab.length);

           //条件一:nextTab == nextTable
           //成立:表示当前扩容正在进行中
           //不成立:1.nextTable被设置为Null 了,扩容完毕后,会被设为Null
           //       2.再次出发扩容了...咱们拿到的nextTab 也已经过期了...
           //条件二:table == tab
           //成立:说明 扩容正在进行中,还未完成
           //不成立:说明扩容已经结束了,扩容结束之后,最后退出的线程 会设置 nextTable 为 table

           //条件三:(sc = sizeCtl) < 0
           //成立:说明扩容正在进行中
           //不成立:说明sizeCtl当前是一个大于0的数,此时代表下次扩容的阈值,当前扩容已经结束。
           while (nextTab == nextTable && table == tab &&
                  (sc = sizeCtl) < 0) {


               //条件一:(sc >>> RESIZE_STAMP_SHIFT) != rs
               //      true->说明当前线程获取到的扩容唯一标识戳 非 本批次扩容
               //      false->说明当前线程获取到的扩容唯一标识戳 是 本批次扩容
               //条件二: JDK1.8 中有bug jira已经提出来了 其实想表达的是 =  sc == (rs << 16 ) + 1
               //        true-> 表示扩容完毕,当前线程不需要再参与进来了
               //        false->扩容还在进行中,当前线程可以参与
               //条件三:JDK1.8 中有bug jira已经提出来了 其实想表达的是 = sc == (rs<<16) + MAX_RESIZERS 
              //条件四:transferIndex <= 0
               //      true->说明map对象全局范围内的任务已经分配完了,当前线程进去也没活干..
               //      false->还有任务可以分配。
               if ((sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 ||
                   sc == rs + MAX_RESIZERS || transferIndex <= 0)
                   break;


               if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1)) {
                   transfer(tab, nextTab);
                   break;
               }
           }
           return nextTab;
       }
       return table;
   }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值