天天看點

HashMap是如何形成死循環的?(最完整的配圖講解)

作者|依本多情

當線程一剛剛擴容好數組,此時剛要準備進行rehash,但是此時線程二強行插入進來執行,并且線程二已經rehash完成之後的狀态圖(上半部分表示的線程一,下半部分表示的是線程二)

HashMap是如何形成死循環的?(最完整的配圖講解)

此時線程一已經被喚醒了,要開始進行操作rehash操作,把key為5的節點還是挂在數組下标為1的位置上,并且key為5的後面是9這個節點(這裡其實吧之前的數組擴容為4個了,然後肯定需要重新定位下标啊,是以這裡是對4進行取餘,然後對應查到對應的數組下标下的連結清單中)

HashMap是如何形成死循環的?(最完整的配圖講解)
HashMap是如何形成死循環的?(最完整的配圖講解)

從第一個狀态開始繼續接着處理key為9的節點,是以應該是都挂在桶數組下标為1的連結清單上順序為9---->5---->NULL

HashMap是如何形成死循環的?(最完整的配圖講解)

此時在第三步時候處理9完畢之後,他發現節點9後面還有一個節點5(這個節點5是因為線程二中已經rehash完畢之後留下的),此時他又會把節點5放線上程一中的首部此時也就是5---->9----5(後面這部分的9–>5是保留的第三個狀态留下的),到這裡就形成了死循環。

HashMap是如何形成死循環的?(最完整的配圖講解)