设为首页 加入收藏

TOP

基于JDK1.8的ConcurrentHashMap分析(二)
2018-03-02 06:57:04 】 浏览:480
Tags:基于 JDK1.8 ConcurrentHashMap分析
  } finally {
                //设置阈值
                sizeCtl = sc;
            }
            break;
        }
    }
    return tab;
}


我们看到第7,8行。如果有线程在初始化,那么那就等待,让出cpu。


初始化只允许一个线程对表进行初始化,如果不巧有其他线程进来了,那么会让其他线程交出 CPU 等待下次系统调度。这样,保证了表同时只会被一个线程初始化。


默认初始化为大小为16,阕值为0.75


我们重新回到putVal这个方法中去。


//检测到桶结点是 ForwardingNode 类型,协助扩容
else if ((fh = f.hash) == MOVED)
    tab = helpTransfer(tab, f);
//桶结点是普通的结点,锁住该桶头结点并试图在该链表的尾部添加一个节点
else {
      V oldVal = null;
      synchronized (f) {
          if (tabAt(tab, i) == f) {
              //向普通的链表中添加元素,无需赘述
              if (fh >= 0) {
                binCount = 1;
                for (Node<K,V> e = f;; ++binCount) {
                    K ek;
                    if (e.hash == hash &&((ek = e.key) == key ||(ek != null && key.equals(ek)))) {
                        oldVal = e.val;
                        if (!onlyIfAbsent)
                            e.val = value;
                            break;
                      }
                      Node<K,V> pred = e;
                      if ((e = e.next) == null) {
                        pred.next = new Node<K,V>(hash, key,value, null);
                        break;
                      }
                }
          }
          //向红黑树中添加元素,TreeBin 结点的hash值为TREEBIN(-2)
          else if (f instanceof TreeBin) {
              Node<K,V> p;
              binCount = 2;
                if ((p = ((TreeBin<K,V>)f).putTreeva l(hash, key,                                      value)) != null) {
                  oldVal = p.val;
                  if (!onlyIfAbsent)
                      p.val = value;
                }
          }
      }
  }
  //binCount != 0 说明向链表或者红黑树中添加或修改一个节点成功
  //binCount  == 0 说明 put 操作将一个新节点添加成为某个桶的首节点
  if (binCount != 0) {
        //链表深度超

首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Uboot 引导内核时加载地址与入口.. 下一篇解决PyCharm无法显示matplotlib绘..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目