JDK1.7 HashMap擴(kuò)容:多線程下的死循環(huán)和丟失

多線程情況下,HashMap擴(kuò)容可能會形成死循環(huán)情況,或者丟失值。
假設(shè):
三個Entity,rehash后key值分別為3、5、7。
如圖:


init.png

JDK 1.7 HashMap擴(kuò)容時關(guān)鍵代碼:

    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;  // 第5行  關(guān)鍵步驟1
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];  //關(guān)鍵步驟2
                newTable[i] = e;     //關(guān)鍵步驟3
                e = next;            //關(guān)鍵步驟4
            }
        }
    }

請記住上面的4個關(guān)鍵步驟?。?!

死循環(huán):

B第一次while循環(huán):

2.png

B第二次while循環(huán):
3.png

B第三次while循環(huán):
4.png

線程B執(zhí)行完的狀態(tài),A恢復(fù)執(zhí)行:
5.png

線程A開始執(zhí)行的狀態(tài):
6.png

線程A開始執(zhí)行第6行,第一次while循環(huán):
7.png

A第二次while循環(huán):
8.png

A第三次while循環(huán):
9.png

線程A執(zhí)行完,已形成死循環(huán)。紅線。

值丟失:

更換下三個Entity的順序,注意如圖:


10.png

線程A開始執(zhí)行:
11.png

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

相關(guān)閱讀更多精彩內(nèi)容

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