ConcurrentHashMap學習心得

ConcurrentHshMap利用CAS+Synchronized來保證并發(fā)更新安全潜沦,底層依然使用數(shù)組+鏈表+紅黑樹的存儲結構

主要屬性

table : 默認為NULL睛廊,初始化發(fā)生在第一次插入操作,默認大小為16的數(shù)組态鳖,用來儲存Node節(jié)點數(shù)據(jù)簇爆,擴容時大小總是2的冪次方。

nextTable:默認為NULL峦嗤,擴容時新生成的數(shù)組,大小為原數(shù)組的兩倍滚粟。

sizeCtl (控制標識符):默認為0寻仗,用來控制table的初始化和擴容操作

* ?-1 代表table正在初始化

* ?-N 正有N-1個線程正在進行擴容操作

* ?N 下一次需要擴容的臨界值,與HashMap中的臨界值一樣

Node節(jié)點類

final int hash凡壤;

final K key署尤;

volatile V val; ? ? 用volatile修飾的value和next 保證了并發(fā)內存的可見性?

volatile Node<K,V> next;

ForwardingNode?

final Node<K,V> [] nextTable;

super (-1,NULL,NULL,NULL,NULL) hash值為-1其它為NULL

// ForwardingNode 只在擴容是發(fā)揮作用亚侠,負責表示當前節(jié)點以被copy走了曹体。

put方法

計算key的hashcode在hash得出index數(shù)組中存放的位置

檢查數(shù)組是否初始化若未初始化則進行初始化

1若table[index]==null ,該節(jié)點為空 ,利用CAS操作插入數(shù)據(jù)

2若table[index]!=null ,該位置已有節(jié)點硝烂,發(fā)生碰撞 ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?a . 檢查該節(jié)點的hash值是否為-1 箕别,若為-1則說明有線程正在進行擴容操作 ,調用helpTransfer幫助其擴容

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b . 該節(jié)點hash值不為-1 滞谢,鎖定hash值相同的鏈表頭結點 串稀,進行插入或者更新操作,鏈表過長變?yōu)榧t黑樹


trypersize擴容方法

CAS操作把sizeCtl變?yōu)?1狮杨,表示正在進行初始化 確保只有一個線程進行初始化母截。

創(chuàng)建nextTable 數(shù)組大小為table2倍 ,容量為原來1.5倍

調用transfer方法 把數(shù)據(jù)復制到新數(shù)組?

transfer方法


volatile

1 在工作內存中每次使用變量必須從主內存刷新最新的值

2 每次修改后必須立刻同步會主內存

3 禁止指令從排序

CAS操作

compare and swap ?比較并交換 有三個參數(shù) 1內存中的值 ?2預期的值 ?3 改變后的值

樂觀鎖的一種體現(xiàn) 先操作后檢查橄教。非阻塞式同步

如何保證操作和檢測兩個步驟具備原子性清寇,如果用鎖那就是去意義了

靠硬件來完成原子性,這兩個操作通過一條處理器指令來完成保證了原子性护蝶。

缺點:造成ABA問題华烟,初次讀值為A,并且在準備賦值時檢測到它仍為A持灰,也不能保證它沒有變過盔夜,可能在這段期間內變?yōu)锽

版本號來解決ABA問題,AtomicStampedReference 給變量加上版本號改變一次版本加一?

通過檢查版本號來確定變量改變過沒有堤魁。

版本號的原理在MySQL innodb引擎也有體現(xiàn) innodb 通過MVCC多版本并發(fā)實現(xiàn)高并發(fā)喂链。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姨涡,隨后出現(xiàn)的幾起案子衩藤,更是在濱河造成了極大的恐慌,老刑警劉巖涛漂,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赏表,死亡現(xiàn)場離奇詭異,居然都是意外死亡匈仗,警方通過查閱死者的電腦和手機瓢剿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悠轩,“玉大人间狂,你說我怎么就攤上這事』鸺埽” “怎么了鉴象?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵忙菠,是天一觀的道長。 經(jīng)常有香客問我纺弊,道長牛欢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任淆游,我火速辦了婚禮傍睹,結果婚禮上,老公的妹妹穿的比我還像新娘犹菱。我一直安慰自己拾稳,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布腊脱。 她就那樣靜靜地躺著访得,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虑椎。 梳的紋絲不亂的頭發(fā)上震鹉,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音捆姜,去河邊找鬼传趾。 笑死,一個胖子當著我的面吹牛泥技,可吹牛的內容都是我干的浆兰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼珊豹,長吁一口氣:“原來是場噩夢啊……” “哼簸呈!你這毒婦竟也來了?” 一聲冷哼從身側響起店茶,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蜕便,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贩幻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轿腺,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年丛楚,在試婚紗的時候發(fā)現(xiàn)自己被綠了族壳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡趣些,死狀恐怖仿荆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤拢操,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布锦亦,位于F島的核電站,受9級特大地震影響庐冯,放射性物質發(fā)生泄漏孽亲。R本人自食惡果不足惜坎穿,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一展父、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玲昧,春花似錦栖茉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尘应,卻和暖如春突颊,著一層夾襖步出監(jiān)牢的瞬間研乒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柜裸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓鉴未,卻偏偏與公主長得像舶吗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歹颓,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容