JDK1 7的HashMap死迴圈

2021-10-23 19:11:29 字數 610 閱讀 8957

為什麼在jdk1.7多執行緒情況下會很容易出現hashmap死迴圈,這個還是要根據它採取的擴容策略來看,它的擴容策略是頭插法,因此會導致這樣的問題。在jdk1.8改進為尾插法,但並不意味著尾插法能適應多執行緒併發的場景,我認為其最主要的考慮就是頭插法在正常情況下是與原來鍊錶順序相逆的,而尾插不會改變其順序。

第一階段:執行緒1和執行緒2同時開始擴容,但是執行緒1在執行完entrynext = e.next後由於不可控因素(如cpu排程)暫時失去執行能力,此時thread獲取到cpu資源,並進行擴容操作

第二階段:執行緒2執行完後,執行緒1又重新獲得了cpu資源,此時 e對於的key是3,next對於的是key為7,但是此時key為7的next是3(如上圖,也就是說會影響到指標更新),然後執行緒1執行擴容操作,先將3插入槽中,然後更新指標,e為7,next為e.next也就是3,這樣就造成了迴圈

這樣就造成了頭插迴圈,導致死鎖問題。

JDK1 7的HashMap原始碼解讀

default initial capacity 初始化容量,中為1 4 即為16。為什麼要這樣寫呢?maximum capacity 最大容量,中衛1 30 即為2的30次冪。30次冪的原因是 改屬性為int型別,int型別最大為4個位元組,共32個二進位制位,理論上可以向左移動31次,即31次冪...

JDK1 7和JDK1 8HashMap的區別

jdk1.7與jdk1.8中hashmap區別 最重要的一點是底層結構不一樣,1.7是陣列 鍊錶,1.8則是陣列 鍊錶 紅黑樹結構 jdk1.7中當雜湊表為空時,會先呼叫inflatetable 初始化乙個陣列 而1.8則是直接呼叫resize 擴容 插入鍵值對的put方法的區別,1.8中會將節點插...

JDK1 8中的hashmap和JDK1 7的區別

1.資料插入的方式不同 jdk1.7用的是頭插法,而jdk1.8用的是尾插法,這是由於jdk1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鍊錶死迴圈問題。但是在jdk1.8之後是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鍊錶死迴圈的問題。2.組成結構不同 jdk1.7的時候使...