Hashmap jdk7 死循環


如果理解的有問題,歡迎大家指正。

https://www.cnblogs.com/webglcn/p/10587708.html 

 

jdk7的hashmap 由數組和鏈表組成,存在幾個問題:

 

當key的hash碰撞頻率高,導致鏈表內的數據過多,影響查詢效率, 時間復雜度為O(n)

 

不同的key經過hash運算,結果落到同一個table的元素中,元素內部是鏈表結構,新增的數據會直接插入到鏈表的結尾。當查詢的時候,首先通過hash找到元素在hashmap中的table位置,然后遍歷鏈表找到元素,遍歷的時間復雜度為O(n).

 

多線程並發操作hashmap,導致鏈表查詢死循環。

並發擴容時,同時執行transfer方法,如果原始鏈表相鄰的兩個元素,擴容后仍是相鄰的兩個元素,由於采用了頭插入,會造成兩個元素形成互為首尾,形成死循環。舉例如下。

 

初始狀態hashmap 的初始大小為 2^n (n=1), hashmap的size是2, 插入兩個元素3和7

 兩個線程對hashmap進行擴容(調用transfer), 假設線程一執行到獲取第一個元素3,CPU調度到第二個線程, 第二個線程完成了全部的擴容操作,由於擴容采用了頭插法,元素7插入到元素3之前,並作為鏈表的第一個元素。此時狀態為

 

線程一采用頭插法,形成死循環

 

參考文獻

http://www.cnblogs.com/dongguacai/p/5599100.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM