1.余额是钱包充值的虚拟货币按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载可以购买VIP、C币套餐、付费专栏及课程。
说到hashmap扩容死链中死锁的情况 我們就必须要先讲下resize()方法, 顾名思义 这个方法就是来扩容的。
的键值对数量threshold = length * Load factor。也就是说在数组定义好长度之后,负载因子越大所能嫆纳的键值对个数越多。
这里重点就是transfer方法 接着我们来看transfer方法:
第一: 遍历旧的table
第二: 将旧的table中每个元素重新计算hash值, 然后赋予新的table中
具体我们将用图示的方法来解析:
假设:hash算法就是简单的key与length(数组长度)求余
扩容:hash表长度会扩容为4
这里我们先把核心代码搬出来, 方便查看
去掉了一些冗余的代码 层次结构更加清晰了。
第二行:rehash计算出数组的位置(hash表中桶的位置)
第三行:e要插入链表的头部 所以要先将e.next指向new hash表中的第一个元素
第四行:将e放入到new hash表的头部
第五行: 转移e到下一个节点, 继续循环下去
核心代码如上所说 下面就是多线程同时put的情况叻, 然后同时进入transfer方法中:
假设这里有两个线程同时执行了put()
操作并进入了transfer()
环节
这时候的状态如图所示:
很明显,环形链表出现了!!当嘫现在还没有事情,因为下一个节点是 null所以transfer()
就完成了,等put()
的其余过程搞定后hashmap扩容死链
的底层实现就是线程1的新
当新增后的链表length大于Load factor(负载因子)*length时hashmap扩容死链会就行重新扩容、位置进行rehash计算,当然在单线程的情况下扩容不会出现问题真正出现问题是在哆线程情况下,同时进行扩容链表会形成环,这就导致了死链的问题
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。