面试官:高并发下 HashMap 的死循环是怎么形成的?

HashMap在高并发环境下可能出现死循环,这是由于扩容时线程不安全导致的。当两个线程同时触发扩容并迁移元素时,可能导致链表结构形成环。线程1在迁移过程中被挂起,线程2接着迁移,改变链表结构,之后线程1继续迁移,形成环。要避免这种情况,可以使用ConcurrentHashMap。
摘要由CSDN通过智能技术生成

代码回顾

我常常听别人说,不要在并发情况下使用HashMap,可能会出现死循环,这个死循环是怎么形成的呢?

我们都知道,HashMap的底层是由数组加链表来实现的

当往HashMap中put一个键值对时,如果HashMap中的键值对数量 size 大于或等于阈值(threshold) 并且null != table[bucketIndex] 时会进行扩容

bucketIndex为该键值对最后被散列到hash表table的位置

比如 table的初始容量为4,加载因子为0.75,此时阈值为3,table已有三个元素,现在put一个元素<1,”A”>,<1,”A”>被散列到table[1]处,而table[1] != null,此时满足扩容条件

阈值 = 容量 * 加载因子

threshold = capacity * loadFactor

扩容时先生成一个是table大小2倍的newTable,然后把table中的元素迁移到newTable中,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值