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是執行緒安全的,由於分...