ConcurrentHashMap實現原理

2021-08-07 11:58:32 字數 1197 閱讀 8432

concurrenthashmap實現原理

在jdk1.7中:

concurrenthashmap是通過segment陣列+hashentry陣列+單鏈表的結構進行儲存資料。segment陣列中存放的是hashentry陣列的首位址,hashentry中存放的是乙個單鏈表(首節點位址)。

put():我們通過put()方法向concurrenthashmap中存放資料,首先會通過key計算出hash值,通過hash值定位到相應的segment,然後再將這個segment加鎖,判斷是否需要擴容,需要則擴容,然後根據這個segment所對應的hashentry索引最大值(陣列長度-1)和hash值按位與(&)的結果定位到相應的hashentry,然後遍歷這個單鏈表,如果有重複值,則覆蓋,並將舊值賦給變數oldvalue,如果沒有重複值,則在煉表頭插入,並將null賦值給oldvalue,最後返回oldvalue,並解鎖,完成對資料的新增。

get():我們通過get()方法獲取concurrenthashmap的值,首先通過key獲取hash值,定位到相應的segment,然後用和put()方法相同的方式定位到相應的hashentry,然後遍歷單鏈表,如果有元素的key和所要獲取的key的hash值相等並且key的equals比較結果為真,則將該元素的value賦值給變數v,若v不為null則返回,否則返回乙個加鎖讀直接獲取該元素的值,如果遍歷要還沒有找到則返回為null。

在jdk1.8中,

concurrenthashmap採用node陣列+鍊錶+紅黑樹的結構儲存元素。

put():首先利用key計算hash值,根據hash值定位到相應的node,如果node陣列還未初始化則先初始化,然後判斷是否正在擴容,如果正在擴容,則返回擴容後的陣列,然後將該node加鎖,如果node中存放的是鍊錶結構,則遍歷鍊錶,有重複值則覆蓋,沒有則在煉表頭插入,返回oldvalue,如果是紅黑樹結構,按照紅黑樹的插入方式插入,如果插入後節點個數大於等於8,則將其轉換為紅黑樹,最後計數值加一(可能引發擴容)。

get():和hashmap的get()方法類似,先根據key計算出來的hash值定位node,然後遍歷鍊錶或者紅黑樹,找到則返回,未找到則返回為null。

jdk1.7和jdk1.8中concurrenthashmap的實現原理,1.7中是將整個hashentry加鎖,而1.8是將鍊錶或者紅黑樹加鎖,進一步減少併發衝突,而且採用鍊錶+紅黑樹的結構儲存資料使得資料在整個陣列中分布很均勻,提高了查詢效率,提高了效能。

ConcurrentHashMap 實現原理

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

ConcurrentHashMap儲存原理

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

ConcurrentHashMap底層原理

出自jdk5新引進的concurrent包,concurrenthashmap主要解決了兩個問題 相較於只使用synchronized的hashtable提高了效能,根據具體場景進行不同的設計,盡量避免了重量級鎖。不同於hashmap,採用了fail safe弱一致性迭代器,再迭代器使用過程中,可以...