如果理解的有問題,歡迎大家指正。
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