第十章浙踢、高并發(fā)鎖及ConcurrentHashMap原理分析

線程不安全的HashMap

????因?yàn)槎嗑€程環(huán)境下,使用Hashmap進(jìn)行put操作會(huì)引起死循環(huán)灿渴,導(dǎo)致CPU利用率接近100%成黄,所以在并發(fā)情況下不能使用HashMap。


效率低下的HashTable容器

?????HashTable容器使用synchronized來保證線程安全逻杖,但在線程競(jìng)爭(zhēng)激烈的情況下HashTable的效率非常低下奋岁。因?yàn)楫?dāng)一個(gè)線程訪問HashTable的同步方法時(shí),其他線程訪問HashTable的同步方法時(shí)荸百,可能會(huì)進(jìn)入阻塞或輪詢狀態(tài)闻伶。如線程1使用put進(jìn)行添加元素,線程2不但不能使用put方法添加元素够话,并且也不能使用get方法來獲取元素蓝翰,所以競(jìng)爭(zhēng)越激烈效率越低光绕。


鎖分段技術(shù)

????HashTable容器在競(jìng)爭(zhēng)激烈的并發(fā)環(huán)境下表現(xiàn)出效率低下的原因,是因?yàn)樗性L問HashTable的線程都必須競(jìng)爭(zhēng)同一把鎖畜份,那假如容器里有多把鎖诞帐,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問容器里不同數(shù)據(jù)段的數(shù)據(jù)時(shí)爆雹,線程間就不會(huì)存在鎖競(jìng)爭(zhēng)停蕉,從而可以有效的提高并發(fā)訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術(shù)钙态,首先將數(shù)據(jù)分成一段一段的存儲(chǔ)慧起,然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問其中一個(gè)段數(shù)據(jù)的時(shí)候册倒,其他段的數(shù)據(jù)也能被其他線程訪問蚓挤。有些方法需要跨段,比如size()和containsValue()驻子,它們可能需要鎖定整個(gè)表而而不僅僅是某個(gè)段灿意,這需要按順序鎖定所有段,操作完畢后崇呵,又按順序釋放所有段的鎖脾歧。這里“按順序”是很重要的,否則極有可能出現(xiàn)死鎖演熟,在ConcurrentHashMap內(nèi)部鞭执,段數(shù)組是final的,并且其成員變量實(shí)際上也是final的芒粹,但是兄纺,僅僅是將數(shù)組聲明為final的并不保證數(shù)組成員也是final的,這需要實(shí)現(xiàn)上的保證化漆。這可以確保不會(huì)出現(xiàn)死鎖估脆,因?yàn)楂@得鎖的順序是固定的。

應(yīng)用場(chǎng)景

????當(dāng)有一個(gè)大數(shù)組時(shí)需要在多個(gè)線程共享時(shí)就可以考慮是否把它給分層多個(gè)節(jié)點(diǎn)了座云,避免大鎖疙赠。并可以考慮通過hash算法進(jìn)行一些模塊定位。

其實(shí)不止用于線程朦拖,當(dāng)設(shè)計(jì)數(shù)據(jù)表的事務(wù)時(shí)(事務(wù)某種意義上也是同步機(jī)制的體現(xiàn))圃阳,可以把一個(gè)表看成一個(gè)需要同步的數(shù)組,如果操作的表數(shù)據(jù)太多時(shí)就可以考慮事務(wù)分離了(這也是為什么要避免大表的出現(xiàn))璧帝,比如把數(shù)據(jù)進(jìn)行字段拆分捍岳,水平分表等.


ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。

Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap里扮演鎖的角色锣夹,HashEntry則用于存儲(chǔ)鍵值對(duì)數(shù)據(jù)页徐。

一個(gè)ConcurrentHashMap里包含一個(gè)Segment數(shù)組,Segment的結(jié)構(gòu)和HashMap類似银萍,是一種數(shù)組和鏈表結(jié)構(gòu)变勇, 一個(gè)Segment里包含一個(gè)HashEntry數(shù)組,每個(gè)HashEntry是一個(gè)鏈表結(jié)構(gòu)的元素贴唇, 每個(gè)Segment守護(hù)者一個(gè)HashEntry數(shù)組里的元素,當(dāng)對(duì)HashEntry數(shù)組的數(shù)據(jù)進(jìn)行修改時(shí)搀绣,必須首先獲得它對(duì)應(yīng)的Segment鎖


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市滤蝠,隨后出現(xiàn)的幾起案子豌熄,更是在濱河造成了極大的恐慌授嘀,老刑警劉巖物咳,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蹄皱,居然都是意外死亡览闰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門巷折,熙熙樓的掌柜王于貴愁眉苦臉地迎上來压鉴,“玉大人,你說我怎么就攤上這事锻拘∮涂裕” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵署拟,是天一觀的道長(zhǎng)婉宰。 經(jīng)常有香客問我,道長(zhǎng)推穷,這世上最難降的妖魔是什么心包? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮馒铃,結(jié)果婚禮上蟹腾,老公的妹妹穿的比我還像新娘。我一直安慰自己区宇,他們只是感情好娃殖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著议谷,像睡著了一般珊随。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天叶洞,我揣著相機(jī)與錄音鲫凶,去河邊找鬼。 笑死衩辟,一個(gè)胖子當(dāng)著我的面吹牛螟炫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艺晴,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昼钻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了封寞?” 一聲冷哼從身側(cè)響起然评,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狈究,沒想到半個(gè)月后碗淌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖锥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年亿眠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磅废。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纳像,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拯勉,到底是詐尸還是另有隱情竟趾,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布宫峦,位于F島的核電站岔帽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斗遏。R本人自食惡果不足惜山卦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诵次。 院中可真熱鬧账蓉,春花似錦、人聲如沸逾一。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遵堵。三九已至箱玷,卻和暖如春怨规,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锡足。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工波丰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舶得。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓掰烟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沐批。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纫骑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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