美文网首页
问题:HashMap扩容死锁

问题:HashMap扩容死锁

作者: 栢鸽 | 来源:发表于2019-05-11 15:08 被阅读0次

1.8以下的版本才有该问题,在1.8已经解决该问题。

扩容调用transfer

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];
    // 下面这行重点
    transfer(newTable, initHashSeedAsNeeded(newCapacity));
    table = newTable;
    threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
}

transfer方法

/**
 * Transfers all entries from current table to newTable.
 */
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;
        }
    }
}

我们假设Map中有个table[i]如下链表:

graph TD
A-->B

这个时候有两个个线程要进程扩容分别为T1,T2


image.png

相关文章

网友评论

      本文标题:问题:HashMap扩容死锁

      本文链接:https://www.haomeiwen.com/subject/uamxaqtx.html