日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

阿里二面:聽說過 HashMap 會導致CPU飆升100%嗎?

來源: 責編: 時間:2024-05-24 17:24:11 250觀看
導讀一、問題描述經(jīng)常有些面試官會問,是否了解過 HashMap 在多線程環(huán)境下使用時可能會發(fā)生死循環(huán),導致服務器 cpu 100% 的線上故障?關(guān)于這個問題,很多年前,在淘寶內(nèi)網(wǎng)里就有很多的程序員發(fā)過這種帖子說一個CPU 被100%了,原因竟

一、問題描述

經(jīng)常有些面試官會問,是否了解過 HashMap 在多線程環(huán)境下使用時可能會發(fā)生死循環(huán),導致服務器 cpu 100% 的線上故障?QLT28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于這個問題,很多年前,在淘寶內(nèi)網(wǎng)里就有很多的程序員發(fā)過這種帖子說一個CPU 被100%了,原因竟是多線程環(huán)境下使用 HashMap 造成的死循環(huán),并且這個事發(fā)生了很多次。QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

雖然 Java 官方明確表示,在多線程環(huán)境下不推薦使用 HashMap,但是對于這種問題,小編其實也比較意外,如果不是深入的去了解 HashMap,都不知道有這樣的問題。QLT28資訊網(wǎng)——每日最新資訊28at.com

為什么會產(chǎn)生死循環(huán)呢?下面我們來還原一下問題的經(jīng)過。QLT28資訊網(wǎng)——每日最新資訊28at.com

二、問題重現(xiàn)

在之前的集合系列文章中,我們了解到 HashMap 是一個哈希數(shù)組 + 鏈表的數(shù)據(jù)結(jié)構(gòu),在實際的程序開發(fā)中,我們經(jīng)常會使用到 HashMap,如果對 HashMap 不是很了解,大家可以看小編之前寫的《深入淺出分析 HashMap 》一文。QLT28資訊網(wǎng)——每日最新資訊28at.com

HashMap 是一個非線程安全的集合操作類,如果我們的程序操作是單線程的,那么一切都沒問題。當我們的程序是多線程操作 HashMap 類時,那么問題就來了,我們一起來復現(xiàn)一下。QLT28資訊網(wǎng)——每日最新資訊28at.com

測試代碼,如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

使用了4個線程來向 HashMap 中添加元素,可能一次運行不一定有效果,可以反復運行幾次!QLT28資訊網(wǎng)——每日最新資訊28at.com

控制臺輸出結(jié)果:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

可以清晰的看到,在遍歷 map 的內(nèi)容時,已經(jīng)死循環(huán)了!QLT28資訊網(wǎng)——每日最新資訊28at.com

再來看看,活動監(jiān)視器,結(jié)果如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

cpu 的使用率,直接接近 200%!QLT28資訊網(wǎng)——每日最新資訊28at.com

接下來我們?nèi)ゲ榭聪?java 中剛剛運行的 HashThreadTest 類堆棧情況:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

可以看到,HashMap 的擴容操作導致了死循環(huán)!QLT28資訊網(wǎng)——每日最新資訊28at.com

通過測試,我們發(fā)現(xiàn) HashMap 在多線程環(huán)境下進行操作,的確會產(chǎn)生死循環(huán),并且會導致 CPU 100%!QLT28資訊網(wǎng)——每日最新資訊28at.com

這是為什么呢?我們一起來閱讀一下源碼!QLT28資訊網(wǎng)——每日最新資訊28at.com

三、源碼閱讀

注意注意,小編在進行測試的時候,使用的是 JDK1.7 的版本!QLT28資訊網(wǎng)——每日最新資訊28at.com

如果你使用 JDK1.8 的版本,不好意思,不一定能復現(xiàn)這個問題!因為 JDK1.8 已經(jīng)修復了這個問題,但是依然不建議在多線程環(huán)境下使用 HashMap!QLT28資訊網(wǎng)——每日最新資訊28at.com

我們繼續(xù)來看看為什么使用 JDK1.7 會出現(xiàn)這個問題!QLT28資訊網(wǎng)——每日最新資訊28at.com

既然是 put 階段造成的數(shù)據(jù)問題,我們不妨一起來看看 HashMap 的 put 過程!QLT28資訊網(wǎng)——每日最新資訊28at.com

1.HashMap 添加過程

HashMap 的 put 源碼實現(xiàn)如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

接著我們來看看addEntry()方法,將元素插入到數(shù)組中,并且檢查容量是否超標,源碼實現(xiàn)如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

上面例子中,我們初始化的時候給定的容量是 2,所以在添加元素時必定會擴容!如果超出閥值,就進行擴容處理,創(chuàng)建一個更大容量的 hash 表,然后把從老的 Hash 表中遷移到新的 Hash 表中,源碼如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

將舊 hash 表中的元素復制到新的 hash 表中,源碼如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

整個 put 過程,大致可以分如下幾個步驟:QLT28資訊網(wǎng)——每日最新資訊28at.com

  • 第一步是通過 key 計算出來的 hash 和 equals 來判斷元素是否存在,如果存在,直接覆蓋;反之,插入;
  • 第二步是將元素插入到 hash 表中,如果不同的元素都在一個 hash 數(shù)組下標下,就以鏈表的形式,采用頭插法存儲在 hash 節(jié)點下;
  • 最后就是判斷當前數(shù)組容量是否大于擴容閥值,如果大于,就進行擴容處理,然后將舊元素復制到新的數(shù)組中;

好了,這個過程基本上沒啥問題。QLT28資訊網(wǎng)——每日最新資訊28at.com

我們再來演示一下擴容中重新計算元素 hash 的過程!QLT28資訊網(wǎng)——每日最新資訊28at.com

2.單線程下擴容元素 hash 過程

假設在單線程環(huán)境下,我們初始化的時候,給定的數(shù)組容量是2,分別添加3個元素,內(nèi)容如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

  • key=3,value=A;
  • key=4,value=B;
  • key=5,value=C;

源碼如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

添加完成之后,數(shù)組就會進行擴容處理,擴容后 hash 的容量為原來的2倍,擴容操作流程如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

在單線程環(huán)境下,一切看起來都很正常,擴容過程也相當順利。接下來我們看下并發(fā)情況下的擴容。QLT28資訊網(wǎng)——每日最新資訊28at.com

3.多線程擴容元素 hash 過程

假設我們有兩個線程,來分別添加3個元素。QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

線程二執(zhí)行完添加任務之后,在準備將舊元素遷移到新元素的時候,也就是準備 rehash 時,突然被 CPU 掛起,此時阻塞在如下圖中的第57行,不再往下執(zhí)行!而線程一繼續(xù)執(zhí)行直到擴容完成。QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

2個線程此時的執(zhí)行結(jié)果,內(nèi)容如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

接著線程二被喚醒,繼續(xù)回到第57行執(zhí)行。QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

此時注意了,我們來詳細的分析一下這個過程!QLT28資訊網(wǎng)——每日最新資訊28at.com

第一次循環(huán)過程如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

  • 第1步:此時 e 等于{key:3,value:A},next=e.next={key:5,value:C};
  • 第2步:通過 key 重新 hash 計算得到下標 i = 3;
  • 第3步:newTable為局部變量,內(nèi)容都為null,所以 e.next = newTable[i]=null;
  • 第4步:newTable[i]=e={key:3,value:A};
  • 第5步:e=next={key:5,value:C};

循環(huán)結(jié)果如下,e={key:5,value:C},滿足while()循環(huán)條件,接著繼續(xù)!QLT28資訊網(wǎng)——每日最新資訊28at.com

圖片QLT28資訊網(wǎng)——每日最新資訊28at.com

第二次循環(huán)過程如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

  • 第1步:此時 e 等于{key:5,value:C},取最新的鏈表結(jié)構(gòu),next=e.next={key:3,value:A};
  • 第2步:通過 key 重新 hash 計算得到下標 i = 3;
  • 第3步:在第一次循環(huán)中,newTable[i]已經(jīng)插入值,所以 e.next = newTable[i]={key:3,value:A};
  • 第4步:newTable[i]=e={key:5,value:C};
  • 第5步:e=next={key:3,value:A};

循環(huán)結(jié)果如下,e={key:3,value:A},滿足while()循環(huán)條件,接著繼續(xù)!QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

第三次循環(huán)過程如下:QLT28資訊網(wǎng)——每日最新資訊28at.com

  • 第1步:此時 e 等于{key:3,value:A},取最新的鏈表結(jié)構(gòu),next=e.next=null;
  • 第2步:通過 key 重新 hash 計算得到下標 i = 3;
  • 第3步:在第二次循環(huán)中,newTable[i]已經(jīng)插入值,所以 e.next = newTable[i]={key:5,value:C};
  • 第4步:newTable[i]=e={key:3,value:A};
  • 第5步:e=next=null;

循環(huán)結(jié)果如下,e=null,while()程序不在循環(huán)!QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

綜合線程1、線程2執(zhí)行結(jié)果,最終 hashMap 的存儲結(jié)果,如下圖:QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

可以很清晰的看到,鏈表發(fā)生死循環(huán)了!QLT28資訊網(wǎng)——每日最新資訊28at.com

于是,當我們在遍歷 hashMap 鏈表內(nèi)容的時候,就會出現(xiàn)上文中問題復現(xiàn)的場景,死循環(huán)式的輸出相同的內(nèi)容,CPU 直接飆到200%了!QLT28資訊網(wǎng)——每日最新資訊28at.com

對于這種問題,當初有人上報到 SUN 公司,但是 SUN 不認為這是一個問題,因為 HashMap 本來就不支持并發(fā)操作!QLT28資訊網(wǎng)——每日最新資訊28at.com

QLT28資訊網(wǎng)——每日最新資訊28at.com

所以,不建議在多線程環(huán)境下使用 HashMap,那如果要在多線程環(huán)境下使用 map 操作類,該怎么辦呢?QLT28資訊網(wǎng)——每日最新資訊28at.com

四、解決辦法

辦法肯定是有的,如果大家想在多線程場景下使用 HashMap,有兩種解決辦法:QLT28資訊網(wǎng)——每日最新資訊28at.com

  • 第一種,推薦使用并發(fā)包中的 ConcurrentHashMap 類,一種使用分段鎖的 hashMap 類,在之后的文章中,咱們也會介紹到它。
  • 另一種,是使用Collections.synchronizedMap(Mao<K,V> map)工具方法,將 HashMap 變成一個線程安全的 map,其實就是對 map 中的方法進行加鎖處理,保證多線程下操作安全!

本文鏈接:http://m.www897cc.com/showinfo-26-90663-0.html阿里二面:聽說過 HashMap 會導致CPU飆升100%嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 敏捷的數(shù)據(jù)工程實踐

下一篇: 在 WebApi 項目中快速開始使用 RabbitMQ

標簽:
  • 熱門焦點
  • K60 Pro官方停產(chǎn) 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經(jīng)透露了,Redmi K60 Pro已經(jīng)停產(chǎn)且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產(chǎn)之后
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網(wǎng)課的原因激活了平板市場,如今網(wǎng)課的時代已經(jīng)過去,大家的生活都恢復到了正軌,這也就意味著,真正考驗平板電腦生存的環(huán)境來了。也就是面對著這種殘酷的
  • 石頭智能洗地機A10 Plus體驗:雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機A10 Plus。從這個產(chǎn)品名上就不難看出,這次石頭推出的并不是常見的掃地機器
  • 6月iOS設備性能榜:M2穩(wěn)居榜首 A系列只能等一手3nm來救

    沒有新品發(fā)布,自然iOS設備性能榜的上榜設備就沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動,畢竟蘋果新品的發(fā)布節(jié)奏就是這樣的,一年下來也就幾個移動端新品,不會像安卓廠商,一
  • 如何通過Python線程池實現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機制,它可以在程序啟動時創(chuàng)建一組線程,并將它們置于等待任務的狀態(tài)。當任務到達時,線程池中的某個線程會被喚醒并執(zhí)行任務,執(zhí)行完任
  • 三分鐘白話RocketMQ系列—— 如何發(fā)送消息

    我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(消息堆積)、消費 三大塊領(lǐng)域。那接下來,我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過程。注意,如果白話中不小心提到相關(guān)代
  • 微軟邀請 Microsoft 365 商業(yè)用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網(wǎng)絡應用程序提供交互性的最常見方式。但我們經(jīng)常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內(nèi)置瀏覽器的功能。
  • 機構(gòu)稱Q2國內(nèi)智能手機銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據(jù)市場調(diào)查機構(gòu)Counterpoint Research公布的最新報告,2023年第2季度中國智能手機銷量同比下降4%,創(chuàng)新自2014年以來第2季度銷量新低。報
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
午夜欧美视频| 国产精品视屏| 免费永久网站黄欧美| 久久综合九色99| 欧美精品v日韩精品v韩国精品v| 欧美日韩国内| 国产日韩欧美精品| 在线视频观看日韩| 亚洲一区二区四区| 久久影院亚洲| 欧美视频免费看| 国产麻豆9l精品三级站| 在线欧美视频| 亚洲一区二区三区影院| 久久久久久久欧美精品| 免费高清在线一区| 国产精品久久久久秋霞鲁丝| 影音先锋久久精品| 在线中文字幕不卡| 美女视频黄 久久| 国产精品海角社区在线观看| 国内精品久久久久久影视8| 日韩亚洲国产欧美| 久久久久久久999| 国产精品igao视频网网址不卡日韩 | 亚洲激情综合| 欧美一区二区三区久久精品| 欧美国产在线电影| 国产午夜一区二区三区| 亚洲每日更新| 久久精品系列| 国产精品久久久久久久第一福利 | 亚洲国产成人av在线| 亚洲性夜色噜噜噜7777| 麻豆精品视频在线| 国产精品欧美精品| 日韩视频在线永久播放| 久久久人人人| 国产九区一区在线| 日韩网站免费观看| 久久综合国产精品台湾中文娱乐网| 国产精品欧美日韩| 日韩亚洲欧美一区| 欧美成人r级一区二区三区| 国产欧美精品在线观看| 中文在线一区| 欧美另类极品videosbest最新版本 | 欧美激情网友自拍| 韩国精品久久久999| 亚洲宅男天堂在线观看无病毒| 欧美精品成人91久久久久久久| 精品二区视频| 久久国产婷婷国产香蕉| 国产精品久久久久久久一区探花| 亚洲免费观看高清在线观看| 久久婷婷国产综合国色天香| 国产啪精品视频| 亚洲影院色无极综合| 欧美日本久久| 亚洲精品久久久久久下一站| 久久婷婷国产综合国色天香| 国产伪娘ts一区| 亚洲在线观看视频| 欧美视频在线观看一区二区| 日韩一区二区免费看| 欧美高清在线| 亚洲国产一区二区三区在线播| 久久精品国产77777蜜臀| 国产精品私人影院| 亚洲一区在线视频| 国产精品久久久久秋霞鲁丝| 亚洲视频中文| 欧美午夜在线观看| 一本色道**综合亚洲精品蜜桃冫| 欧美精品18+| 日韩一区二区免费高清| 欧美另类久久久品| 亚洲最黄网站| 国产精品伦理| 午夜精品久久久久久99热软件| 国产精品国产成人国产三级| 亚洲一区二区三| 国产精品大片wwwwww| 亚洲一区二区三区午夜| 国产精品捆绑调教| 亚洲欧美日韩成人| 国产欧美日韩综合| 久久久久免费视频| 亚洲国产精品999| 欧美国产在线电影| 亚洲精品综合| 国产精品久久久久久av福利软件| 亚洲制服av| 国产日本欧美视频| 久久久青草青青国产亚洲免观| 激情欧美日韩| 欧美国产欧美综合 | 在线电影院国产精品| 另类天堂视频在线观看| 亚洲国产精品视频一区| 欧美精品在线看| 亚洲一区二区免费| 国产日韩在线看片| 老司机一区二区| 亚洲精品一二| 国产精品高清一区二区三区| 西西裸体人体做爰大胆久久久| 国产欧美一区二区视频| 久久久一二三| 亚洲精品在线二区| 国产精品露脸自拍| 久久精品夜夜夜夜久久| 亚洲国产欧美日韩另类综合| 欧美日韩国产首页| 亚洲欧美综合网| 精品二区久久| 欧美日韩一区免费| 欧美怡红院视频| 亚洲黄色片网站| 欧美亚洲不卡| 久久久久成人精品| 亚洲清纯自拍| 国产精品午夜电影| 蜜乳av另类精品一区二区| 一区二区精品国产| 国产一二精品视频| 欧美巨乳波霸| 欧美一区二区视频97| 亚洲人成网站色ww在线| 国产精品色一区二区三区| 久热精品在线视频| 亚洲一区二区三区久久| 在线观看视频一区二区| 国产精品高清网站| 开心色5月久久精品| 亚洲一区二区网站| 亚洲国产视频直播| 国产日韩欧美精品在线| 欧美精品久久一区二区| 欧美伊人久久久久久久久影院 | 欧美揉bbbbb揉bbbbb| 久久久久se| 亚洲香蕉在线观看| 在线日本高清免费不卡| 国产精品久久久91| 男女激情久久| 欧美一区二区视频网站| 99精品福利视频| 在线播放中文字幕一区| 国产精品久久久一区麻豆最新章节| 噜噜噜久久亚洲精品国产品小说| 亚洲综合久久久久| 亚洲精品欧美日韩专区| 国内精品久久久久国产盗摄免费观看完整版| 欧美激情视频给我| 久久久久国产一区二区三区四区| 在线视频欧美日韩| 亚洲国内精品在线| 国产一区二区三区免费在线观看| 欧美日韩免费观看一区二区三区| 久久五月天婷婷| 亚洲欧美日韩综合| 9久re热视频在线精品| 在线国产欧美| 国产专区精品视频| 国产精品色一区二区三区| 欧美精品一区二区高清在线观看| 久久久无码精品亚洲日韩按摩| 午夜精品久久久久久久蜜桃app | 99这里只有久久精品视频| 亚洲国产成人一区| 精品51国产黑色丝袜高跟鞋| 国产精品裸体一区二区三区| 欧美久久在线| 欧美国产精品va在线观看| 久久亚洲午夜电影| 久久精品欧美日韩| 欧美一区视频在线| 亚洲欧洲av一区二区| 亚洲天堂成人在线视频| 9人人澡人人爽人人精品| 亚洲三级性片| 亚洲啪啪91| 亚洲精品久久7777| 亚洲人成精品久久久久| 亚洲福利视频网| 在线电影院国产精品| 国外视频精品毛片| 国产又爽又黄的激情精品视频| 国产噜噜噜噜噜久久久久久久久| 国产精品久久久久久亚洲毛片| 欧美性猛交一区二区三区精品| 欧美日韩美女一区二区| 欧美日韩免费观看一区=区三区| 欧美激情久久久久久| 欧美精品在线观看91| 欧美紧缚bdsm在线视频| 欧美激情久久久| 欧美日韩国产精品专区| 欧美日韩国产欧美日美国产精品| 欧美日韩成人综合| 欧美日韩亚洲一区| 欧美四级电影网站| 国产精品捆绑调教|