在jdk1.7中concurrenthashmap採用了陣列+segment+分段鎖的方式實現。
concurrenthashmap中的分段鎖稱為segment
,它即類似於hashmap
的結構,即內部擁有乙個entry
陣列,陣列中的每個元素又是乙個鍊錶,同時又是乙個reentrantlock(segment繼承了reentrantlock)。
concurrenthashmap使用分段鎖技術,將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當乙個執行緒占用鎖訪問其中乙個段資料的時候,其他段的資料也能被其他執行緒訪問,能夠實現真正的併發訪問。如下圖是concurrenthashmap的內部結構圖:從上面的結構我們可以了解到,
concurrenthashmap
定位乙個元素的過程需要進行兩次hash操作。第一次
hash
定位到segment
,第二次hash定位到元素所在的鍊錶的頭部。
壞處這一種結構的帶來的***是hash的過程要比普通的hashmap要長
好處寫操作的時候可以只對元素所在的segment進行加鎖即可,不會影響到其他的segment,這樣,在最理想的情況下,concurrenthashmap可以最高同時支援segment數量大小的寫操作(剛好這些寫操作都非常平均地分布在所有的segment上)。
所以,通過這一種結構,concurrenthashmap的併發能力可以大大的提高
利用 cas + synchronized 來保證併發更新的安全底層使用陣列+鍊錶+紅黑樹來實現
public v put
(k key, v value)
final v put
(k key,
int hash, v value,
boolean onlyifabsent)
break;}
e = e.next;
//不斷向後遍歷
}else}}
finally
return oldvalue;
}
假設table已經初始化完成,put操作採用cas+synchronized實現併發插入或更新操作:
table
陣列是被volatile
關鍵字修飾的,這就代表我們不需要擔心table
陣列的執行緒可見性問題,也就沒有必要再加鎖來實現併發了。
static
class
node
implements
map.entry
{final
int hash;
final k key;
volatile v val;
volatile node
next;
//volitale修飾,記憶體可見性
//底層陣列
transient
volatile node
table;
專案
jdk1.7
jdk1.8
概覽
同步機制
分段鎖,每個segment繼承reentrantlock
cas + synchronized保證併發更新
儲存結構
陣列+鍊錶
陣列+鍊錶+紅黑樹
鍵值對hashentry
node
put操作
多個執行緒同時競爭獲取同乙個segment鎖,獲取成功的執行緒更新map;失敗的執行緒嘗試多次獲取鎖仍未成功,則掛起執行緒,等待釋放鎖
訪問相應的bucket時,使用sychronizeded關鍵字,防止多個執行緒同時操作同乙個bucket,如果該節點的hash不小於0,則遍歷鍊錶更新節點或插入新節點;如果該節點是treebin型別的節點,說明是紅黑樹結構,則通過puttreeval方法往紅黑樹中插入節點;更新了節點數量,還要考慮擴容和鍊錶轉紅黑樹
size實現
統計每個segment物件中的元素個數,然後進行累加,但是這種方式計算出來的結果並不一樣的準確的。先採用不加鎖的方式,連續計算元素的個數,最多計算3次:如果前後兩次計算結果相同,則說明計算出來的元素個數是準確的;如果前後兩次計算結果都不同,則給每個segment進行加鎖,再計算一次元素的個數;
通過累加basecount和countercell陣列中的數量,即可得到元素的總個數;
鎖的粒度
原來是對需要進行資料操作的segment加鎖
現調整為對每個陣列元素加鎖(node)
python面試總結 Python面試題總結
文件 為 從網路收集整理 word 版本可編輯 文件 為 從網路收集整理 word 版本可編輯 1.python 執行緒池原理?我理解為執行緒池是乙個存放很多執行緒的單位,同時還有乙個對應的任務佇列。整個執行過程其實就是使用執行緒池中已有有限的執行緒把任務佇列中的任務做完。這樣做的好處就是你不需要為...
微軟面試 經典演算法 程式設計藝術 紅黑樹4大系列總結
無私分享,造福天下 以下是本blog內的微軟面試100題系列,經典演算法研究系列,程式設計師程式設計藝術系列,紅黑樹系列4大經典原創系列作品與一些重要文章的集錦。一 微軟面試100題系列 二 經典演算法研究系列 三 程式設計師程式設計藝術系列 四 紅黑樹系列 五 其它重要文章節選 後記 世上本無路,...
2019科大訊飛大資料研究院提前批面試總結
最近參加了科大訊飛的提前批內推,昨天二面也就是終面結束了,現把自己的感悟總結如下 時間2018.6.26上午10 00 11 20 總結起來一面說的還是挺多的,兩個面試官,人都很好,乙個多小時的面試,不過大多是簡歷上的東西。首先是自我介紹,基本資訊沒有講太多,就說了自己的基本情況,老家和現居地,還有...