HashMap扩容导致死链问题

分析造成原因:

*当新增后的链表length大于Load factor(负载因子)length时hashMap会就行重新扩容、位置进行rehash计算,当然在单线程的情况下扩容不会出现问题,真正出现问题是在多线程情况下,同时进行扩容,链表会形成环,这就导致了死链的问题。

由于扩容导致的死链发生在transfer()中

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) {
                e.hash = null == e.key ? 0 : hash(e.key);
            }
            int i = indexFor(e.hash, newCapacity);
            e.next = newTable[i];
            newTable[i] = e;
            e = next;
        }
    }
}

由图可见,在进行get()操作时,就会一直陷入死循环无法取到值,导致CPU的飙升。同时,其不仅仅是形成了死链,而且也将元素为c给舍弃掉了。

在后来的JDK1.8采用的是尾插法,避免了死链的形成,但是也是无法作用于多线程的,多线程扩容时会导致数据的丢失。


标题:HashMap扩容导致死链问题
作者:JonLv
地址:http://39.108.183.139:8080/articles/2023/03/11/1678547398712.html