一、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。從表 沒...