多線程HashMap可能存在的死循環問題

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,所以現在就造成了死循環

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。