JDK1.7 不支持并发的HashMap 死循环环链死链 记录

JDK1.7 不支持并发的HashMap 死循环环链死链 记录,第1张

JDK1.7 HashMap 死循环/环链/死链

JDK1.7 HashMap 源码:

    transient Entry[] table;
   
    void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }

        Entry[] newTable = new Entry[newCapacity];
        boolean oldAltHashing = useAltHashing;
        useAltHashing |= sun.misc.VM.isBooted() &&
                (newCapacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD);
        boolean rehash = oldAltHashing ^ useAltHashing;
        transfer(newTable, rehash);
        table = newTable;
        threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
    }

    
    void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;
        for (Entry e : table) {
            while(null != e) {
                Entry next = e.next;
                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;
            }
        }
    }

回头看了几篇文章,发现解释都有些问题,看不明白,自己记录下吧

以下是自我理解,待确认是否正确,先记录吧

原因:局部变量table(oldTable)的数据分布发生多次改变造成的问题。

举例:线程1 进行扩展重新分布数据时,某个链(Entry[])分布1Entry和2Entry 。线程2改变了oldTable的数据分布。线程1再进行for遍历时,某个Entry e(for中的)中碰巧存在2Entry(因为被线程2改变了数据分布,所以能再次获取2Entry ),此时碰巧再次分布到了1Entry,2Entry所在的链,形成了2Entry,1Entry,2Entry链,造成相互引用的问题,导致后续再在此链分布数据时出现while死循环,一般在get时导致while死循环

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/868327.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存