多線程HashMap可能存在的死循環(huán)問題

HashMap多線程情況下可能會出現(xiàn)的問題:

參考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);
        }
    }
}

上述代碼在多線程下會出現(xiàn)問題的,

142929_Vawr_120166.jpg

上圖演示了hashMap擴容的過程(這里的reHash() 簡單成 key.hashCode()對擴容后數(shù)組長度取余)

假設:兩個線程同時進行擴容時,假設線程一在Entry<K,V> next = e.next;執(zhí)行后掛起,而此時線程二已經(jīng)完成擴容,

第一次執(zhí)行do while中的程序時,key:3的entry的next指向了key:7的entry,因為現(xiàn)在操作的是線程二已經(jīng)擴容后的。

在假設的情況下,next已經(jīng)是key:7的entry了。所以第二次執(zhí)行的時候,e是key:7的entry,而經(jīng)過線程二的擴容操作后,key:7的entry的next是key:3的entry,所以現(xiàn)在就造成了死循環(huán)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容