HashMap死鎖原因分析及原理

2021-09-29 08:31:20 字數 849 閱讀 6574

一、hashmap原理

1.hashmap的本質就是陣列和鍊錶。table是乙個entry陣列,每乙個陣列元素儲存乙個entry節點,而entry節點內部又連線著同樣key的下乙個entry節點,就構成了鍊錶。.

詳情見 hashmap原始碼分析

2.hashmap死鎖原因:

hashmap會造成死鎖,因為hashmap是執行緒非安全的,多併發的情況容易造成死鎖,若要高併發推薦使用concurrenthashmap。這裡的加了鎖。

高併發時引起hashmap死鎖的原因分析:

hashmap死鎖原因分析

總的來說是:

hash表的初始大小(hashmap初始容量大小為16)有限,當put存入的資料增加時就必須擴容了,原始碼中會呼叫rehash方法(即是把原表內容移入到乙個新的表中),單執行緒下rehash就是把原來鍊錶遍歷,從新的鍊錶頭部(為什麼不加到新鍊錶最後?因為複雜度是 o(n))挨個放入,放入的過程中依次執行函式transfer();

entrynext = e.next;//保留頭指標的下乙個節點——因為是單鏈表,如果要轉移頭指標,一定要儲存下乙個結點,不然轉移後鍊錶就丟了

e.next = newtable[i];//插入到鍊錶的頭部——e 要插入到鍊錶的頭部,所以要先用 e.next 指向新的 hash 表第乙個元素(為什麼不加到新鍊錶最後?因為複雜度是 o(n))

newtable[i] = e;//——現在新 hash 表的頭指標仍然指向 e 沒轉移前的第乙個元素,所以需要將新 hash 表的頭指標指向 e

e = next//——轉移 e 的下乙個結點12

3456

多執行緒的時候會出現同時

put()操作,並進入了transfer()環節;

HashMap死鎖原因及替代方案

1 首先我們需要簡單地了解一下hashmap資料結構 hashmap通常會用乙個指標陣列 假設為table 來做分散所有的key,當乙個key被加入時,會通過hash算 法通過key算出這個陣列的下標i,然後就把這個插到table i 中,如果有兩個不同的key被算了。但有時候兩個key算出的下標會...

死鎖及死鎖產生原因條件

作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解 除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中...

oracle死鎖原因分析 轉

死鎖的原因 1。模擬死鎖 1。1。主表 create table create table wdz1 wdz1id number not null,memo varchar2 20 alter table wdz1 add constraint primary key wdz1id 1。2。從表 沒...