二維碼
        企資網

        掃一掃關注

        當前位置: 首頁 » 企資快訊 » 娛樂生活 » 正文

        HashMap中的resize以及死鏈的情況

        放大字體  縮小字體 發(fā)布日期:2022-12-14 02:47:14    作者:葉鈞蕊    瀏覽次數:40
        導讀

        我們都知道HashMap是線程不安全得, 如果多線程來訪問會有什么問題呢? 答案是會造成死鏈。接下來我們就分析下為何會造成死鏈?說到HashMap中死鎖得情況, 我們就必須要先講下resize()方法, 顧名思義, 這個方法就

        我們都知道HashMap是線程不安全得, 如果多線程來訪問會有什么問題呢?

        答案是會造成死鏈。

        接下來我們就分析下為何會造成死鏈?

        說到HashMap中死鎖得情況, 我們就必須要先講下resize()方法, 顧名思義, 這個方法就是來擴容得。

        當HashMap得size超過 thredshold時, 就需要擴容了。 當我們put時:

        (截圖代碼為JDK7 HashMap源碼)

        首先,我們需要知道幾個最基本得概念: Entry<K,V>[] table得初始化長度length(默認值是16),Load factor為負載因子(默認值是0.75),threshold是HashMap所能容納得蕞大數據量得Entry(鍵值對)個數。size是HashMap中實際存在 得鍵值對數量。threshold = length * Load factor。也就是說,在數組定義好長度之后,負載因子越大,所能容納得鍵值對個數越多。

        接著我們直接看上面得代碼, 當size >= threshold且table[bucketIndex]不為空就會觸發(fā)resize操作。 然后看resize()方法:

        這里重點就是transfer方法, 接著我們來看transfer方法:

        第壹: 遍歷舊得table;

        第二: 將舊得table中每個元素重新計算hash值, 然后賦予新得table中;

        多線程擴容:

        這里我們先把核心代碼搬出來, 方便查看

        while(null != e) {

        Entry<K,V> next = e.next; //第壹行

        int i = indexFor(e.hash, newCapacity); //第二行

        e.next = newTable[i]; //第三行

        newTable[i] = e; //第四行

        e = next; //第五行

        }

        去掉了一些冗余得代碼, 層次結構更加清晰了。

        第壹行:記錄old hash表中e.next;

        第二行:rehash計算出數組得位置(hash表中桶得位置);

        第三行:e要插入鏈表得頭部, 所以要先將e.next指向new hash表中得第壹個元素;

        第四行:將e放入到new hash表得頭部;

        第五行:轉移e到下一個節(jié)點, 繼續(xù)循環(huán)下去;

        核心代碼如上所說, 下面就是多線程同時put得情況了, 然后同時進入transfer方法中:

        假設這里有兩個線程同時執(zhí)行了put()操作,并進入了transfer()環(huán)節(jié):

        while(null != e) {

        Entry<K,V> next = e.next; //線程1執(zhí)行到這里被調度掛起了

        e.next = newTable[i];

        newTable[i] = e;

        e = next;

        }

        上述代碼在多線程并發(fā)執(zhí)行時,容易出現“死鏈”。

         
        (文/葉鈞蕊)
        打賞
        免責聲明
        本文為葉鈞蕊推薦作品?作者: 葉鈞蕊。歡迎轉載,轉載請注明原文出處:http://m.sneakeraddict.net/qzkx/show-101278.html 。本文僅代表作者個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發(fā)現,立即刪除,作者需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

        粵ICP備16078936號

        微信

        關注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯系
        客服

        聯系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        日韩精品无码一区二区三区不卡| 国产福利电影一区二区三区久久老子无码午夜伦不 | 色综合久久中文色婷婷 | 狠狠干中文字幕| 亚洲国产精品无码av| 无码任你躁久久久久久| 日本中文一区二区三区亚洲| 台湾无码一区二区| 亚洲日韩乱码中文无码蜜桃臀网站| 国产成人A亚洲精V品无码| 日韩精品无码久久一区二区三| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二| 亚洲精品无码久久久久| 亚洲中文字幕无码爆乳av中文| 狠狠精品久久久无码中文字幕 | 无码国产精品一区二区免费模式| 亚洲欧美日韩中文在线制服| 亚洲av无码精品网站| 伊人热人久久中文字幕| 日韩丰满少妇无码内射| 最近高清中文字幕免费| 国产精品无码DVD在线观看| 久久无码高潮喷水| 中文字幕精品亚洲无线码一区| 无码少妇一区二区| 国产中文字幕乱人伦在线观看 | 中出人妻中文字幕无码| 精品久久久久久久久中文字幕| 国产精品无码无片在线观看| 无码精品尤物一区二区三区| 国产精品中文久久久久久久 | 久久午夜福利无码1000合集| 精品久久久久久无码中文字幕一区 | 亚洲天堂中文资源| 亚洲熟妇无码八V在线播放 | 18禁黄无码高潮喷水乱伦| 一本一道AV无码中文字幕| 最好看更新中文字幕| 亚洲一级Av无码毛片久久精品| 久久精品中文字幕无码绿巨人| 中出人妻中文字幕无码|