concurrentHashMap原始碼分析

2022-10-11 05:51:09 字數 1258 閱讀 3902

concurrenthashmap是hashmap的執行緒安全版本,內部也是使用(陣列 + 鍊錶 + 紅黑樹)的結構來儲存元素。

相比於同樣執行緒安全的hashtable來說,效率等各方面都有極大地提高。,在這裡可以使用上篇那個**進行測試,

根據結果可以知道concurrenthashmap是執行緒安全的,由於分為16個segemnet所以併發度為16.

//在插入資料的時候,呼叫的是下面的方法

public

v put(k key, v value)

/** implementation for put and putifabsent

*/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

; }

整體流程跟hashmap比較類似,大致是以下幾步:

(1)如果桶陣列未初始化,則初始化;

(2)如果待插入的元素所在的桶為空,則嘗試把此元素直接插入到桶的第乙個位置;

(3)如果正在擴容,則當前執行緒一起加入到擴容的過程中;

(4)如果待插入的元素所在的桶不為空且不在遷移元素,則鎖住這個桶(分段鎖);

(5)如果當前桶中元素以鍊錶方式儲存,則在鍊錶中尋找該元素或者插入元素;

(6)如果當前桶中元素以紅黑樹方式儲存,則在紅黑樹中尋找該元素或者插入元素;

(7)如果元素存在,則返回舊值;

(8)如果元素不存在,整個map的元素個數加1,並檢查是否需要擴容;

新增元素操作中使用的鎖主要有(自旋鎖 + cas + synchronized + 分段鎖)。

為什麼使用synchronized而不是reentrantlock?

因為synchronized已經得到了極大地優化,在特定情況下並不比reentrantlock差。

ConcurrentHashMap原始碼分析

hashmap 先說hashmap,hashmap是執行緒不安全 的,在併發環境下,可能會形成環狀鍊錶 hashtable hashtable和hashmap的實現原理幾乎一樣,差別無非是1.hashtable不允許key和value為null 2.hashtable是執行緒安全的。但是hashta...

ConcurrentHashMap原始碼詳解

成員變數private static final int maximum capacity 1 30 private static final int default capacity 16 static final int max array size integer.max value 8 pr...

concurrentHashMap原始碼分析

concurrenthashmap是hashmap的執行緒安全版本,內部也是使用 陣列 鍊錶 紅黑樹 的結構來儲存元素。相比於同樣執行緒安全的hashtable來說,效率等各方面都有極大地提高。在這裡可以使用上篇那個 進行測試,根據結果可以知道concurrenthashmap是執行緒安全的,由於分...