java基础之ConcurrentHashMap1.8(一)

本文详细探讨了Java ConcurrentHashMap1.8的put方法、tabAt、initTable以及扩容时机。对比HashMap,ConcurrentHashMap在扩容策略上有所不同,如binCount超过8时转为红黑树,且当节点数超过特定阈值时触发扩容。此外,文章讨论了ConcurrentHashMap与HashTable的区别,以及为何JDK1.8选择使用内置锁synchronized。最后,提出了提高put效率的两个策略:初始化适当长度以减少扩容和避免hash冲突。
摘要由CSDN通过智能技术生成

put方法

public V put(K key, V value) {
   
        return putVal(key, value, false);
    }

    /** Implementation for put and putIfAbsent */
    final V putVal(K key, V value, boolean onlyIfAbsent) {
   
        if (key == null || value == null) throw new NullPointerException();
        //计算hash
        int hash = spread(key.hashCode());
        int binCount = 0;
        for (Node<K,V>[] tab = table;;) {
   
            Node<K,V> f; int n, i, fh;
            //1.第一次put时初始化map,且只执行一次
            if (tab == null || (n = tab.length) == 0)
                tab = initTable();
            //2.该位置为null则通过cas插入,    
            else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
   
               //2.1 通过cas插入如果失败则进入下次循环
                if (casTabAt(tab, i, null,new Node<K,V>(hash, key, value, null)))
                    break;                   // no lock when adding to empty bin
            }
             //3. f.hash == MOVED 表示正在扩容,则协助其他线程扩容
            else if ((fh = f.hash) == MOVED)
                tab = helpTransfer(tab, f);
             //4.有节点则用和hashmap一样的处理逻辑,只是包了synchronized块
            else {
   
                V oldVal = null;
                synchronized (f) {
   
                    if (tabAt(tab, i) == f) {
   
                        if (fh >= 0) {
   
                            binCount = 1;
                            for 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值