hashmap 線(xiàn)程不安全原理花履,底層實(shí)現(xiàn)

jdk1.7與jdk1.8中HashMap區(qū)別

JDK7,HashMap的結(jié)構(gòu)很簡(jiǎn)單挚赊,基于一個(gè)數(shù)組以及多個(gè)鏈表的實(shí)現(xiàn)诡壁,hash值沖突的時(shí)候,就將對(duì)應(yīng)節(jié)點(diǎn)以鏈表的形式存儲(chǔ)荠割。這樣子的HashMap性能上就有問(wèn)題了妹卿,如果有成百上千個(gè)節(jié)點(diǎn)在hash時(shí)發(fā)生碰撞,存儲(chǔ)一個(gè)鏈表中蔑鹦,那么如果要查找其中一個(gè)節(jié)點(diǎn)夺克,就會(huì)花很長(zhǎng)的時(shí)間,從而導(dǎo)致性能損失嚎朽。

JDK8中采用的數(shù)組+鏈表+紅黑樹(shù)結(jié)構(gòu)的方式铺纽,也是非線(xiàn)程安全的。當(dāng)某個(gè)位桶的鏈表的長(zhǎng)度達(dá)到某個(gè)閥值的時(shí)候哟忍,這個(gè)鏈表就將轉(zhuǎn)換成紅黑樹(shù)狡门。

插入鍵值對(duì)的put方法的區(qū)別,1.8中會(huì)將節(jié)點(diǎn)插入到鏈表尾部锅很,而1.7中是采用頭插其馏。

?擴(kuò)容策略:1.7中是只要不小于閾值就直接擴(kuò)容2倍;而1.8的擴(kuò)容策略會(huì)更優(yōu)化爆安,當(dāng)數(shù)組容量未達(dá)到64時(shí)叛复,以2倍進(jìn)行擴(kuò)容,超過(guò)64之后若桶中元素個(gè)數(shù)不小于7就將鏈表轉(zhuǎn)換為紅黑樹(shù)扔仓,但如果紅黑樹(shù)中的元素個(gè)數(shù)小于6就會(huì)還原為鏈表致扯,當(dāng)紅黑樹(shù)中元素不小于32的時(shí)候才會(huì)再次擴(kuò)容。

之所以鏈表要轉(zhuǎn)成紅黑樹(shù)当辐,還是為了解決存取效率的問(wèn)題。鏈表過(guò)長(zhǎng)鲤看,取數(shù)據(jù)的效率就很慢缘揪,紅黑樹(shù)插入比較慢,但取數(shù)據(jù)還是很快的。

答案:

正常情況下? hashmap 在保存數(shù)據(jù)時(shí)找筝,底層是數(shù)組+鏈表+紅黑樹(shù)? 但是 你去源碼中看時(shí)蹈垢,發(fā)現(xiàn)子啊hashMap 底層沒(méi)有加任何的多線(xiàn)程中的鎖機(jī)制,比如:?synchronize修飾? 袖裕,所以在多線(xiàn)程的情況下? hashMap 的單項(xiàng)鏈表曹抬,可能會(huì)變成一個(gè)環(huán)形的鏈表,所以這個(gè)鏈表上的Next元素的指向永遠(yuǎn)不為null, 所以在遍歷的時(shí)候就是死循環(huán)啊急鳄。

HashMap是線(xiàn)程不安全的谤民,其主要體現(xiàn):

#1.在jdk1.7中,在多線(xiàn)程環(huán)境下疾宏,擴(kuò)容時(shí)會(huì)造成環(huán)形鏈或數(shù)據(jù)丟失张足。

#2.在jdk1.8中,在多線(xiàn)程環(huán)境下坎藐,會(huì)發(fā)生數(shù)據(jù)覆蓋的情況为牍。

1HashMap在put的時(shí)候,插入的元素超過(guò)了容量(由負(fù)載因子決定)的范圍就會(huì)觸發(fā)擴(kuò)容操作岩馍,就是rehash碉咆,這個(gè)會(huì)重新將原數(shù)組的內(nèi)容重新hash到新的擴(kuò)容數(shù)組中,在多線(xiàn)程的環(huán)境下蛀恩,存在同時(shí)其他的元素也在進(jìn)行put操作疫铜,如果hash值相同,可能出現(xiàn)同時(shí)在同一數(shù)組下用鏈表表示赦肋,造成閉環(huán)块攒,導(dǎo)致在get時(shí)會(huì)出現(xiàn)死循環(huán),所以HashMap是線(xiàn)程不安全的

2 HashMap底層是一個(gè)Entry數(shù)組佃乘,當(dāng)發(fā)生hash沖突的時(shí)候囱井,hashmap是采用鏈表的方式來(lái)解決的,在對(duì)應(yīng)的數(shù)組位置存放鏈表的頭結(jié)點(diǎn)趣避。對(duì)鏈表而言庞呕,新加入的節(jié)點(diǎn)會(huì)從頭結(jié)點(diǎn)加入。在hashmap做put操作的時(shí)候會(huì)調(diào)用到以上的方法〕膛粒現(xiàn)在假如A線(xiàn)程和B線(xiàn)程同時(shí)對(duì)同一個(gè)數(shù)組位置調(diào)用addEntry住练,兩個(gè)線(xiàn)程會(huì)同時(shí)得到現(xiàn)在的頭結(jié)點(diǎn),然后A寫(xiě)入新的頭結(jié)點(diǎn)之后愁拭,B也寫(xiě)入新的頭結(jié)點(diǎn)讲逛,那B的寫(xiě)入操作就會(huì)覆蓋A的寫(xiě)入操作造成A的寫(xiě)入操作丟失

ConcurrentHashMap:在hashMap的基礎(chǔ)上,ConcurrentHashMap將數(shù)據(jù)分為多個(gè)segment岭埠,默認(rèn)16個(gè)盏混,然后每次操作對(duì)一個(gè)segment加鎖蔚鸥,避免多線(xiàn)程鎖的幾率,提高并發(fā)效率

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末许赃,一起剝皮案震驚了整個(gè)濱河市止喷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌混聊,老刑警劉巖弹谁,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異句喜,居然都是意外死亡预愤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)藤滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鳖粟,“玉大人,你說(shuō)我怎么就攤上這事拙绊∠蛲迹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵标沪,是天一觀的道長(zhǎng)榄攀。 經(jīng)常有香客問(wèn)我,道長(zhǎng)金句,這世上最難降的妖魔是什么檩赢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮违寞,結(jié)果婚禮上贞瞒,老公的妹妹穿的比我還像新娘。我一直安慰自己趁曼,他們只是感情好军浆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著挡闰,像睡著了一般乒融。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摄悯,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天赞季,我揣著相機(jī)與錄音,去河邊找鬼奢驯。 笑死申钩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘪阁。 我是一名探鬼主播典蜕,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼断盛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了愉舔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伙菜,失蹤者是張志新(化名)和其女友劉穎轩缤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贩绕,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡火的,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淑倾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馏鹤。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖娇哆,靈堂內(nèi)的尸體忽然破棺而出湃累,到底是詐尸還是另有隱情,我是刑警寧澤碍讨,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布治力,位于F島的核電站,受9級(jí)特大地震影響勃黍,放射性物質(zhì)發(fā)生泄漏宵统。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一覆获、第九天 我趴在偏房一處隱蔽的房頂上張望马澈。 院中可真熱鬧,春花似錦弄息、人聲如沸痊班。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辩块。三九已至,卻和暖如春荆永,著一層夾襖步出監(jiān)牢的瞬間废亭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工具钥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豆村,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓骂删,卻偏偏與公主長(zhǎng)得像掌动,于是被迫代替她去往敵國(guó)和親四啰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353