簡(jiǎn)單總結(jié)ConcurrentHashMap

在并發(fā)使用到HashMap的時(shí)候,往往不建議直接用HashMap沸枯,因?yàn)镠ashMap在并發(fā)寫數(shù)據(jù)的時(shí)候容易因?yàn)閞ehash的過程產(chǎn)生環(huán)形鏈表的情況日矫。所以在并發(fā)使用Map結(jié)構(gòu)時(shí),一般建議使用ConcurrentHashMap绑榴。

1 JDK1.7 的ConcurrentHashMap

在JDK1.7中ConcurrentHashMap采用了數(shù)組+Segment+分段鎖的方式實(shí)現(xiàn)哪轿。

  • Segment(分段鎖):ConcurrentHashMap中的分段鎖稱為Segment,它即類似于HashMap的結(jié)構(gòu)翔怎,即內(nèi)部擁有一個(gè)Entry數(shù)組窃诉,數(shù)組中的每個(gè)元素又是一個(gè)鏈表,同時(shí)又是一個(gè)ReentrantLock(Segment繼承了ReentrantLock)。
  • 內(nèi)部結(jié)構(gòu):ConcurrentHashMap使用分段鎖技術(shù)赤套,將數(shù)據(jù)分成一段一段的存儲(chǔ)飘痛,然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問其中一個(gè)段數(shù)據(jù)的時(shí)候于毙,其他段的數(shù)據(jù)也能被其他線程訪問敦冬,能夠?qū)崿F(xiàn)真正的并發(fā)訪問。如下圖是ConcurrentHashMap的內(nèi)部結(jié)構(gòu)圖:
    image.png

從上面的結(jié)構(gòu)我們可以了解到唯沮,ConcurrentHashMap定位一個(gè)元素的過程需要進(jìn)行兩次Hash操作脖旱。第一次Hash定位到Segment,第二次Hash定位到元素所在的鏈表的頭部介蛉。

2 JDK1.8之后的ConcurrentHashMap

JDK8中ConcurrentHashMap參考了JDK8 HashMap的實(shí)現(xiàn)萌庆,采用了數(shù)組+鏈表+紅黑樹的實(shí)現(xiàn)方式來設(shè)計(jì),內(nèi)部大量采用CAS操作币旧。并發(fā)控制使?synchronized 和 CAS 來操作践险。(JDK1.6 以后 對(duì) synchronized 鎖做了很多優(yōu)化) 整個(gè)看起來就像是優(yōu)化過且線程安全的 HashMap,雖然在 JDK1.8 中還能看到 Segment 的數(shù)據(jù)結(jié)構(gòu),但
是已經(jīng)簡(jiǎn)化了屬性巍虫,只是為了兼容舊版本彭则;

JDK1.8的Nod節(jié)點(diǎn)中value和next都用volatile修飾,保證并發(fā)的可見性占遥。

可以理解為俯抖,synchronized 只鎖定當(dāng)前鏈表或紅??叉樹的?節(jié)點(diǎn),這樣只要 hash 不沖突瓦胎,就不會(huì)產(chǎn)?并發(fā)芬萍,效率?提升 N 倍。


image.png

3 ConcurrentHashMap和HashTable的區(qū)別

Hashtable 和 JDK1.8 之前的 HashMap 的底層數(shù)據(jù)結(jié)構(gòu)類似都是采? 數(shù)組+鏈表 的形式搔啊,數(shù)組是 HashMap 的主體柬祠,鏈表則是主要為了解決哈希沖突?存在的;

Hashtable(同?把鎖) :使? synchronized 來保證線程安全负芋,效率?常低下漫蛔。當(dāng)?個(gè)線程訪問同步?法時(shí),其他線程也訪問同步?法示罗,可能會(huì)進(jìn)?阻塞或輪詢狀態(tài)惩猫,如使? put 添加元素,另?個(gè)線程不能使? put 添加元素蚜点,也不能使?get轧房,競(jìng)爭(zhēng)會(huì)越來越激烈效率越低;

總結(jié)一下:

  • ConcurrentHashMap不論1.7還是1.8绍绘,他的執(zhí)行效率都比HashTable要高的多奶镶,主要原因還是因?yàn)镠ash Table使用了一種全表加鎖的方式。


    image.png

參考:

JavaGuide

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陪拘,一起剝皮案震驚了整個(gè)濱河市厂镇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌左刽,老刑警劉巖捺信,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異欠痴,居然都是意外死亡迄靠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門喇辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掌挚,“玉大人,你說我怎么就攤上這事菩咨》褪剑” “怎么了陡厘?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)特占。 經(jīng)常有香客問我糙置,道長(zhǎng),這世上最難降的妖魔是什么摩钙? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任罢低,我火速辦了婚禮,結(jié)果婚禮上胖笛,老公的妹妹穿的比我還像新娘。我一直安慰自己宜岛,他們只是感情好长踊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萍倡,像睡著了一般身弊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上列敲,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天阱佛,我揣著相機(jī)與錄音,去河邊找鬼戴而。 笑死凑术,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的所意。 我是一名探鬼主播淮逊,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扶踊!你這毒婦竟也來了泄鹏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤秧耗,失蹤者是張志新(化名)和其女友劉穎备籽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分井,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡车猬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杂抽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诈唬。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缩麸,靈堂內(nèi)的尸體忽然破棺而出铸磅,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布阅仔,位于F島的核電站吹散,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏八酒。R本人自食惡果不足惜空民,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羞迷。 院中可真熱鬧界轩,春花似錦、人聲如沸衔瓮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽热鞍。三九已至葫慎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薇宠,已是汗流浹背偷办。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澄港,地道東北人椒涯。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像慢睡,于是被迫代替她去往敵國和親逐工。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345