jdk1.7中HashMap死循环问题

本文深入探讨了JDK1.7中HashMap在多线程环境下进行扩容操作时可能导致查询死循环的问题。详细分析了由于头插法引起的链表顺序反转现象,解释了在特定条件下,如a、b节点并发扩容后仍处于同一链表中所引发的死循环机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jdk1.7中HashMap多线程扩容导致查询死循环

原因:
由于jdk1.7中HashMap扩容时迁移数据是采用头插法,顺序会反转

场景:
多线程情况,a,b节点扩容后还是在同一链表中

代码:

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; // 这里线程1挂起
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            }
        }
    }

图解:
在这里插入图片描述
有人向jdk开发者提过这个问题,但是他们并不觉得这是一个bug,HashMap本来就是线程不安全的,在多线程情况下要保证线程安全应该使用ConcurrentHashMap,所以这个问题就是毫无意义的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值