1.8 ConcurrentHashMap為何放棄分段代碼鎖

[toc]

JDK1.7分段代碼鎖的實現(xiàn)

和HashMap一樣在1.7中ConcurrentHashMap的底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組加鏈表车份,和HashMap不同的是ConcurrentHashMap存放的數(shù)據(jù)是一段一段的,即由多個Segment組成华糖,每個Segment都有類似的數(shù)組加鏈表的結(jié)構(gòu)痰洒。
關(guān)于Segment:

ConturrentHashMap有三個參數(shù):

  • initialCapacity:容量瓢棒,初始容量默認16
  • loadFactor:負載因子,默認是0.75
  • concurrentLevel:并發(fā)級別默認是16

其中concurrentLevel控制了Segment的個數(shù)丘喻,在一個ConcurrentHashMap創(chuàng)建后Sement的個數(shù)是不能變的脯宿,擴容過程改變的是每個Segement的大小。

Segement繼承了重入鎖ReentrantLock泉粉,有鎖的功能嗅绰,每個鎖控制的是一段,當每個Segement越來越大時搀继,鎖的力度就變的很大窘面。

  • 優(yōu)點:分段代碼鎖的優(yōu)勢保證了操作不同的map的時候可以并發(fā)執(zhí)行,操作同段map的時候叽躯,進行鎖競爭和等待财边,這相對于直接對這個map同步synchronized是有優(yōu)勢的。
  • 缺點:在于分成多段會比較浪費內(nèi)存空間(不連續(xù)点骑,碎片化)酣难,操作map時競爭同一個分段鎖的概率非常小,分段鎖反而造成更新等操作長時間等待黑滴,當某個段很大時憨募,分段性能會下降。

JDK1.8的ConcurrentHashMap實現(xiàn)

和hashMap一樣采用了數(shù)組鏈表紅黑樹的形式數(shù)組進行擴容袁辈,鏈表可以轉(zhuǎn)化為紅黑樹菜谣。

什么時候擴容?

  • 當前容量超過閾值
  • 當鏈表元素個數(shù)超過默認設(shè)定(8個),當數(shù)組大小還未超過64的時候尾膊,此時進行數(shù)組擴容媳危,如果超過64則將鏈表轉(zhuǎn)化為紅黑樹。

什么時候鏈表轉(zhuǎn)為紅黑樹冈敛?

當數(shù)組大小超過64并且鏈表中元素個數(shù)超過默認8的時候鏈表轉(zhuǎn)為紅黑樹待笑,但鏈表長度小于等于6時候會將紅黑樹轉(zhuǎn)為鏈表(紅黑樹保留鏈表特性)。

1.8的線程安全的實現(xiàn)

1.8的代碼把數(shù)組中每個元素看成一個桶抓谴,可以看到大部分的CAS操作暮蹂,加鎖部分是對桶的頭結(jié)點進行加鎖粒度很小。

為什么棄用Segement而用Synchroniized

  • 減少內(nèi)存開銷癌压,如果使用ReentrantLock則需要節(jié)點繼承AQS來獲取同步支持仰泻,增加內(nèi)存開銷,而1.8只有頭部節(jié)點需要進行同步
  • 內(nèi)部優(yōu)化:synchronized是jvm直接支持的措拇,jvm能夠運行時做出相應的優(yōu)化措施我纪,鎖粗化,鎖消除丐吓,鎖自旋浅悉,這使得synchronized能夠隨著JDK版本升級而不用改動代碼前提下獲得性能提升。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末券犁,一起剝皮案震驚了整個濱河市术健,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粘衬,老刑警劉巖荞估,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稚新,居然都是意外死亡勘伺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門褂删,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飞醉,“玉大人,你說我怎么就攤上這事屯阀∶辶保” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵难衰,是天一觀的道長钦无。 經(jīng)常有香客問我,道長盖袭,這世上最難降的妖魔是什么失暂? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任彼宠,我火速辦了婚禮,結(jié)果婚禮上趣席,老公的妹妹穿的比我還像新娘兵志。我一直安慰自己醇蝴,他們只是感情好宣肚,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悠栓,像睡著了一般霉涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惭适,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天笙瑟,我揣著相機與錄音,去河邊找鬼癞志。 笑死往枷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凄杯。 我是一名探鬼主播错洁,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戒突!你這毒婦竟也來了屯碴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤膊存,失蹤者是張志新(化名)和其女友劉穎导而,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隔崎,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡今艺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爵卒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虚缎。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖技潘,靈堂內(nèi)的尸體忽然破棺而出遥巴,到底是詐尸還是另有隱情,我是刑警寧澤享幽,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布铲掐,位于F島的核電站,受9級特大地震影響值桩,放射性物質(zhì)發(fā)生泄漏摆霉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望携栋。 院中可真熱鬧搭盾,春花似錦、人聲如沸婉支。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽向挖。三九已至蝌以,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間何之,已是汗流浹背跟畅。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溶推,地道東北人徊件。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蒜危,于是被迫代替她去往敵國和親虱痕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353