我們知道hashmap在多線程下是不安全的,那么為什么不安全,這個原因是什么呢。其實核心原因在于擴容的時候多線程的參與會造成前后節點之間相互引用,造成鏈環,下面我們就分析下這個是怎么產生的。
我們假設一個場景:
hashmap里面就兩個元素,里面其中索引1下面有兩個元素:3和7,然后在擴容后為4個元素,那么擴容時候,的步驟,我們可以看下圖:
單線程擴容步驟
上圖為一個在擴容時候數據指向的步驟。其中每一步都是一個原子操作,不可再分
多線程擴容問題
我們這里模擬兩個線程進行擴容:T1和T2
1.T1先執行了步驟1和2
線程T1執行步驟1和步驟2之后就被線程 T2 搶走了,這個時候的元素圖如下圖
2.T2執行步驟1、2和3
在T1執行完步驟1和2之后,T2搶到了cpu開始執行,但是這個時候hashmap還沒有擴展完畢,因此,這個時候線程T2還是會繼續執行擴容的操作,如果T2將步驟1、2和3全部都執行完之后,上面場景就會變成如下這樣
T2執行:
執行完畢后的結果:
這個時候就形成了鏈環