多线程HashMap可能存在的死循环问题

2019-11-13  本文已影响0人  dwwl

HashMap多线程情况下可能会出现的问题:

参考blog: https://my.oschina.net/xianggao/blog/393990

虽然后面的图看不懂qwq,但是自己理解比后面图简单的多

文中的代码应该是JDK8之前的代码

void transfer(Entry[] newTable) {
    Entry[] src = table;
    int newCapacity = newTable.length;
    for (int j = 0; j < src.length; j++) {
        Entry e = src[j];
        if (e != null) {
            src[j] = null;
            do {
                Entry next = e.next;
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            } while (e != null);
        }
    }
}

上述代码在多线程下会出现问题的,

142929_Vawr_120166.jpg

上图演示了hashMap扩容的过程(这里的reHash() 简单成 key.hashCode()对扩容后数组长度取余)

假设:两个线程同时进行扩容时,假设线程一在Entry<K,V> next = e.next;执行后挂起,而此时线程二已经完成扩容,

第一次执行do while中的程序时,key:3的entry的next指向了key:7的entry,因为现在操作的是线程二已经扩容后的。

在假设的情况下,next已经是key:7的entry了。所以第二次执行的时候,e是key:7的entry,而经过线程二的扩容操作后,key:7的entry的next是key:3的entry,所以现在就造成了死循环

上一篇下一篇

猜你喜欢

热点阅读