java7的hsahmap扩容死锁过程与环链形成分析:

扩容:

void resize(int newCapacity){
    Entry [] oldTavle = table;
    int oldCapacity = oldTable.length;
    if(oldCapacity == MAXIMUM_CAPACITY){
        threshold = Integer.MAX_VALUE;
        return;
    }
    Entry [] newTable = new Entry[newCapacity];
    transfer(newTable,initHashSeedAsNeeded(newCapacity));//将老的数组中的元素转移到新的数组中
    table = newTable;
    threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
    }
}

转移

void transfer(Entry[] newTable,boolean rehash){
    int newCapacity = newTable.length;
    for(Entry<K,V> e : table){
        while(null != e){
            Entry<K,V> next = e.next;
            if(rehash){
            //得到hash值
                e.hash = null == e.key ? 0 : hash(e.key);
            }
            //重新计算数组索引
            int i = indexFor(e.hash,newCapacity);
            e.next = newTable[i];
            newTable[i] = e;
                e = next;
        }
    }
}

核心代码

void transfer(Entry[] newTable,boolean rehash){
    int newCapacity = newTable.length;
    //循环就的table数组
    for(Entry<K,V> e : table){
    //判断当前位置下的结点,并移动
        while(null != e){
            Entry<K,V> next = e.next;
            e.next = newTable[i];
            newTable[i] = e;
                e = next;
        }
    }
}

核心代码图解

在单线程时:
在这里插入图片描述
------------------------------------------- 以上是while循环的第一次完成-------------------------------------------
在这里插入图片描述
------------------------------------------- 以上是while循环的第二次完成-------------------------------------------
再次判断e==null,所以跳出while循环
在这里插入图片描述
------------------------------------------- 以上是最终在新的数组中的样子------------------------------------------

在多线程时:(会出现环形链表)
在这里插入图片描述
由于线程1挂起,线程2操作(线程2的操作可以参照在单线程的操作)得到下图结果
在这里插入图片描述
当线程2操作完成后线程1醒了,又开始了挂起之后的操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
------------------------------------------- 执行完成发现形成了循环链表------------------------------------------

在这里插入图片描述
------------------------------------------- 以上是最终在新的数组中的样子------------------------------------------

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值