ConcurrentHashMap 的實現原理

2021-10-04 14:07:33 字數 2375 閱讀 5359

1.建構函式

2.put方法

3.get方法

類似hashtable,執行緒安全,效率高。key 和value不能為null。

資料結構上選擇了hashmap類似的陣列+鍊錶+紅黑樹的方式實現,而加鎖則採用cas和synchronized實現。

sizectl:

sizectl 是 chm 中最重要的狀態變數,包括很多狀態

public

concurrenthashmap

(int initialcapacity,

float loadfactor,

int concurrencylevel)

long size =

(long)(

1.0d+(

double)(

(float)(

(long

)initialcapacity)

/ loadfactor));

int cap = size >=

1073741824l ?

1073741824

:tablesizefor((

int)size)

;this

.sizectl = cap;

}else

}

首先判斷鍵值對是否為null,如果null 丟擲異常。

通過key的hashcode得到hash值,該值為正數。

無線迴圈遍歷

如果當前tab為null,初始化table陣列,且返回

繼續下次遍歷,當前table陣列不為null,建立乙個node,新增進去

/** implementation for put and putifabsent */

final v putval

(k key, v value,

boolean onlyifabsent)

//表示正在擴容

elseif(

(fh = f.hash)

== moved)

tab =

helptransfer

(tab, f)

;else

//如果key不相同,向後追加資料node

node

pred = e;if(

(e = e.next)

== null)}}

else

if(f instanceof

treebin)}

else

if(f instanceof

reservationnode

)throw

newillegalstateexception

("recursive update");

}}if(bincount !=0)

}}addcount

(1l, bincount)

;return null;

}

根據sizectl判斷當前狀態,如果有執行緒正在初始化sizectl<0,讓步,如果沒有,初始化table陣列。

private

final node

inittable()

}finally

break;}

}return tab;

}

private

final

void

addcount

(long x,

int check)

if(check <=1)

return

; s =

sumcount()

;}if(check >=0)

else

if(u.

compareandswapint

(this

, sizectl, sc,

(rs << resize_stamp_shift)+2

))transfer

(tab, null)

; s =

sumcount()

;}}}

public v get

(object key)

else

if(eh <0)

return

(p = e.

find

(h, key)

)!= null ? p.val : null;

while

((e = e.next)

!= null)

}return null;

}

ConcurrentHashMap實現原理

concurrenthashmap實現原理 在jdk1.7中 concurrenthashmap是通過segment陣列 hashentry陣列 單鏈表的結構進行儲存資料。segment陣列中存放的是hashentry陣列的首位址,hashentry中存放的是乙個單鏈表 首節點位址 put 我們通過...

ConcurrentHashMap 實現原理

由於hashmap是乙個執行緒不安全的容器,主要體現在容量大於總量 負載因子發生擴容時會出現環形鍊錶從而導致死迴圈。因此需要支援執行緒安全的併發容器concurrenthashmap。如圖所示,是由segment陣列 hashentry陣列組成,和hashmap一樣,仍然是陣列加鍊表組成。concu...

ConcurrentHashMap儲存原理

concurrenthashmap是併發雜湊對映表的實現,它允許多執行緒環境完全併發讀取,並且支援16個執行緒併發更新。相對於hashtable和同步包包裝的hashmap collections.synchronizedmap new hashmap 具有更高的併發性。在hashtable和同步包...