并发下HashMap头插会造成死循环情况说明
生活随笔
收集整理的這篇文章主要介紹了
并发下HashMap头插会造成死循环情况说明
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說明:
JDK1.8之前HashMap觸發擴容機制時,會創建新的Entry[ ]數組,將舊的Entry數據進行復制,當某個entry上具有鏈式結構時,采用頭插方式進行數據遷移,即將舊鏈表數據從頭部遍歷,每次取到的數據插入到新鏈表的頭部。
但并發下會產生死循環,JDK1.8改用尾插方法。
并發頭插死循環問題:
比如有兩個線程同時對該HashMap進行rehash,要將鏈表進行重新排列
rehash前鏈表結構為:A --> B -->C
線程1進行操作:遍歷原鏈表,首先獲得節點A及A.next = B,操作掛起,線程2進入。(線程1僅獲取到了數據A及next,并未進行其他操作)
線程2進行操作:遍歷原鏈表,以頭插方式遍歷執行,執行完成 B – > A。
線程1繼續執行:遍歷原鏈表,頭插方式執行,完成 B – > A,此時線程2數據提交,線程1發現 B.next 不為null,繼續遍歷執行,又將B.next = A插入,形成A --> B – > A循環結構。
JDK1.8尾插為什么會避免這個問題,因為尾插每次操作,結點順序都保持不變,自己畫一下就知道了。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的并发下HashMap头插会造成死循环情况说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java异常中受检异常非受检异常与Run
- 下一篇: IDEA创建springboot项目:U