ConcurrentHashMap底層實現

2022-08-29 06:06:14 字數 2434 閱讀 5565

concurrenthashmap融合了hashtable和hashmap二者的優勢;

hashtable是做了同步的,hashmap沒有同步,所以hashmap在單執行緒情況下效率高,hashtable在多執行緒情況下,同步操作能保證程式執行的正確性;

但是hashtable每次同步執行都要鎖住整個結構;

concurrenthashmap鎖的方式是稍微細粒度的(分段鎖機制),concurrenthashmap將hash表分為16個桶(預設值);

jdk1.7 concurrenthashmap

底層採用:segment+hashentry

底層乙個segment陣列,儲存乙個segments物件,乙個segments中儲存乙個entry陣列,儲存的每乙個entry物件又是乙個煉表頭結點;

當資料新增時,根據key值找到segment對應的資料段,然後匹配資料塊,採用鍊錶方式進行儲存;

jdk1.8 concurrenthashmap

底層採用:

陣列+鍊錶+紅黑樹,類似於hashmap(jdk1.8)

陣列使用用來存放樹或者鍊錶的頭結點當乙個鍊錶中的數量達到乙個數目時,會使查詢速率降低,所以達到一定閾值時,會將乙個鍊錶轉換為乙個紅黑二叉樹,通告查詢的速率;

concurrenthashmap取消了segment分段鎖的機制,從而實現一段資料進行加鎖,減少了併發,cas(讀)+synchronized(寫)

public

v put(k key, v value)

進入putval()方法:   

final v putval(k key, v value, boolean onlyifabsent)

//判斷當前陣列元素狀態是否需要擴容

else

if ((fh = f.hash) ==moved)

tab =helptransfer(tab, f);

else

node

pred =e;

//判斷當前節點的下乙個節點是否為空,如果為空則新增到下乙個節點當中

if ((e = e.next) == null

) }

}//判斷當前節點是否為紅黑樹

else

if(f instanceof treebin) }}

}if (bincount != 0

) }

}addcount(

1l, bincount);

return

null

; }

1.判斷儲存的key,value是否為空,若為空,則丟擲異常;

2.計算key的hash值,隨後進入無限迴圈,該無限迴圈可以確保成功插入資料,若table表為空或者長度為0,則初始化table表;

3.根據key的hash值取出table表中的結點元素,若取出的結點元素為空(該桶為空),則使用cas將key,value,hash值生成的結點放入桶中;

4.若該節點的hash值為moved,則對該桶中的結點進行轉移;

5.對桶中的第乙個結點進行加鎖,對該桶進行遍歷,桶中的結點的hash值與key值與給定的hash值和key值相等,則根據標識選擇是否進行更新操作(用給定的value值替換該結點的value值),若遍歷完桶仍沒有找到hash值與key值和指定的hash值與key值相等的結點,則直接新生乙個結點並賦值為之前最後乙個結點的下乙個結點;

6.若bincount值達到紅黑樹轉化的閾值,則將桶中的結構轉化為紅黑樹儲存,最後,增加bincount的值;

concurrenthashmap底層get()方法

public v get

(object key)

//結點hash值小於0

else

if (eh < 0

)          

//在桶中查詢

return (p = e.find(h, key)) != null ? p.val : null

;       

//對於結點hash值大於0的情況

while ((e = e.next) != null

) }

return

null

; }

get函式根據key的hash值來計算在哪個桶中,再遍歷桶,查詢元素,若找到則返回該結點,否則,返回null;

ConcurrentHashMap底層分析

jdk1.8之前,通過segments實現,segments繼承reentrantlock,segments充當鎖的角色,每乙個table 桶 都有自己的鎖,因此jdk1.8之前concurrenthashmap採用分段鎖的機制來實現併發的更新操作,提高併發效率。table相當於hashmap中的陣...

ConcurrentHashMap底層原始碼實現

concurrenthashmap底層原始碼實現 空構造方法 常用方法put k key,v value 呼叫putval方法 key,value,false putval key,value,false 如果key或者value為空,則丟擲空指標異常,說明不能新增空值 定義hash為hash值sp...

ConcurrentHashMap底層原理

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