ConcurrentHashMap的通俗解釋

【轉(zhuǎn)載 http://www.bootdo.com/blog/open/post/130

相信每個JAVA程序員都了解HashMap催烘,最大的問題是線程不安全衙荐,因為方法中不涉及到同步矾屯,也正因為如此敏沉,HashMap的效率非常高耻矮,在不涉及線程安全的程序中廣泛被應(yīng)用秦躯。然而當(dāng)涉及到多線程作業(yè)時,就會出現(xiàn)一些問題裆装。為了解決這些問題JAVA提供了Hashtable踱承,這是一種整體加鎖的數(shù)據(jù)結(jié)構(gòu),然而效率不敢恭維哨免。這時候就有了ConcurrentHashMap茎活。

一個例子說明三者關(guān)系:
前提:某個衛(wèi)生間共有16個隔間。

HashMap:每個隔間都沒鎖門琢唾,有人想上廁所妙色,管理員指給他一個隔間,里面沒人的話正常用慧耍,里面有人的話把這個人趕出來然后用身辨。
優(yōu)點,每個人進來不耽誤都能用芍碧;缺點煌珊,每一個上廁所的人都有被中途趕出來的危險。

Hashtable:在衛(wèi)生間外面安裝一個大門泌豆,有人想上廁所定庵,問管理員要一個鑰匙進門,把門反鎖用踪危,用完后出來蔬浙,把鑰匙交換給管理員。在這個人上廁所期間贞远,其他所有人都必須在外面排號畴博。
優(yōu)點,每個人都能安心上完廁所蓝仲;缺點俱病,衛(wèi)生間外面可能已經(jīng)出了人命官疲。 =_=

ConcurrentHashMap:在衛(wèi)生間每個隔間安裝門鎖,有人想上廁所亮隙,管理員指給他一個隔間途凫,進來后這個隔間如果沒人在用則直接用,如果有人正在用溢吻,則排號维费。在這期間其他人會按規(guī)則分到不同的隔間,重復(fù)上述行為促王。
優(yōu)點:每個人都能安心上廁所犀盟,外面排隊的也被均勻分?jǐn)偂H秉c:硼砰。且蓬。。

ConcurrentHashMap實現(xiàn)的原理
ConcurrentHashMap把Map分成了N個Segment(默認16)题翰,其中Segment是線程同步的恶阴,相當(dāng)于分成了N個Hashtable。當(dāng)實現(xiàn)Put方法時豹障,在key值經(jīng)過正常的hash后冯事,還要再經(jīng)過一次segmentForHash算法,用來分配具體防盜哪個Segment血公。后來的線程如果經(jīng)過計算也是放在這個Segment下昵仅,則需要先獲取鎖,如果計算得出應(yīng)該放在其他的Segment累魔,則正常執(zhí)行摔笤,不會影響效率,以此實現(xiàn)線程安全垦写。ConcurrentHashMap使用鎖分離技術(shù)吕世,只要多個修改操作不發(fā)生在同一個Segment上,它們就可以并發(fā)進行梯投。
有些方法需要跨段命辖,比如size()和containsValue(),需要鎖定整個表而而不僅僅是某個段分蓖,這需要按順序鎖定所有段尔艇,操作完畢后,又按順序釋放所有段的鎖么鹤。這里“按順序”是很重要的终娃,否則極有可能出現(xiàn)死鎖,在ConcurrentHashMap內(nèi)部午磁,段數(shù)組是final的尝抖,并且其成員變量實際上也是final的毡们,但是迅皇,僅僅是將數(shù)組聲明為final的并不保證數(shù)組成員也是final的昧辽,這需要實現(xiàn)上的保證。這可以確保不會出現(xiàn)死鎖登颓,因為獲得鎖的順序是固定的搅荞。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市框咙,隨后出現(xiàn)的幾起案子咕痛,更是在濱河造成了極大的恐慌,老刑警劉巖喇嘱,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茉贡,死亡現(xiàn)場離奇詭異,居然都是意外死亡者铜,警方通過查閱死者的電腦和手機腔丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作烟,“玉大人愉粤,你說我怎么就攤上這事∧昧茫” “怎么了衣厘?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長压恒。 經(jīng)常有香客問我影暴,道長,這世上最難降的妖魔是什么探赫? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任型宙,我火速辦了婚禮,結(jié)果婚禮上期吓,老公的妹妹穿的比我還像新娘早歇。我一直安慰自己,他們只是感情好讨勤,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布箭跳。 她就那樣靜靜地躺著,像睡著了一般潭千。 火紅的嫁衣襯著肌膚如雪谱姓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天刨晴,我揣著相機與錄音屉来,去河邊找鬼路翻。 笑死,一個胖子當(dāng)著我的面吹牛茄靠,可吹牛的內(nèi)容都是我干的茂契。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼慨绳,長吁一口氣:“原來是場噩夢啊……” “哼掉冶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脐雪,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤厌小,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后战秋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧亚,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年脂信,在試婚紗的時候發(fā)現(xiàn)自己被綠了癣蟋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吉嚣,死狀恐怖梢薪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尝哆,我是刑警寧澤秉撇,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站秋泄,受9級特大地震影響琐馆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恒序,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一瘦麸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歧胁,春花似錦滋饲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崭参,卻和暖如春呵曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工奄喂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铐殃,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓跨新,卻偏偏與公主長得像富腊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子玻蝌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Java SE 基礎(chǔ): 封裝蟹肘、繼承词疼、多態(tài) 封裝: 概念:就是把對象的屬性和操作(或服務(wù))結(jié)合為一個獨立的整體俯树,并盡...
    Jayden_Cao閱讀 2,112評論 0 8
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司贰盗,掛了不少许饿,但最終還是拿到小米、百度舵盈、阿里陋率、京東、新浪秽晚、CVTE瓦糟、樂視家的研發(fā)崗...
    時芥藍閱讀 42,280評論 11 349
  • 自加入親子教育vip群以來,我可能是群里學(xué)習(xí)最慢赴蝇、行動最慢的那一個了菩浙。剛?cè)肴簳r我想我跟我孩子的關(guān)系還可以,就...
    夢想成真無所不成閱讀 276評論 3 3
  • 與傳統(tǒng)語言相比句伶,F(xiàn)orth的編譯器過于簡單劲蜻。 傳統(tǒng)的編譯器通常設(shè)計成大型的程序,用來將可預(yù)見的合法的語法組織轉(zhuǎn)換為...
    _火魂_閱讀 961評論 0 0
  • 1月份的第一周已經(jīng)過完考余,來到了第二周先嬉,我先來復(fù)盤一下第一周我自己的狀況。 1. 對自己進行嚴(yán)厲并且深刻的譴責(zé)楚堤。在做...
    甜扁桃閱讀 213評論 0 0