HashMap死鎖原因及替代方案

原文鏈接:http://blog.csdn.net/fhzaitian/article/details/51505516

------------------------------------------------------------------------

1、首先我們需要簡單地了解一下HashMap數據結構?
HashMap通常會用一個指針數組(假設為table[])來做分散所有的key,當一個key被加入時,會通過Hash算?
法通過key算出這個數組的下標i,然后就把這個<key, value>插到table[i]中,如果有兩個不同的key被算了。?
但有時候兩個key算出的下標會是一個i,那么就叫沖突,又叫碰撞,這樣會在table[i]上形成一個鏈表。所以?
如果鏈表過多或過長,查找算法則會變成低性能的鏈表遍歷,這是Hash表的缺陷。

我們都知道HashMap初始容量大小為16,一般來說,Hash表這個容器當有數據要插入時,都會檢查容量有沒有超過設定的thredhold,如果超過,需要增大Hash表的尺寸,但是這樣一來,整個Hash表里的元素都需要被重算一遍。這叫rehash,這個成本相當的大。具體大家可以看看JDK源碼

2、現在來討論死鎖產生的原因?
HashMap是非線程安全,死鎖一般都是產生于并發情況下。我們假設有二個進程T1、T2,HashMap容量為2,T1線程放入key A、B、C、D、E。在T1線程中A、B、C Hash值相同,于是形成一個鏈接,假設為A->C->B,而D、E Hash值不同,于是容量不足,需要新建一個更大尺寸的hash表,然后把數據從老的Hash表中?
遷移到新的Hash表中(refresh)。這時T2進程闖進來了,T1暫時掛起,T2進程也準備放入新的key,這時也?
發現容量不足,也refresh一把。refresh之后原來的鏈表結構假設為C->A,之后T1進程繼續執行,鏈接結構?
為A->C,這時就形成A.next=B,B.next=A的環形鏈表。一旦取值進入這個環形鏈表就會陷入死循環。

3、替代方案?
使用ConcurrentHashMap進行替代,ConcurrentHashMap是一個線程安全的Hash Table。可能有人會使用HashTable。當然HashTable也是線程安全,但HashTable鎖定的是整個Hash表,效率相對比較低。而ConcurrentHashMap可以做到讀取數據不加鎖,并且其內部的結構可以讓其在進行寫操作的時候能夠將鎖的粒度保持地盡量地小,


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538026.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

優化mysql數據庫_MySQL數據庫十大優化技巧

WEB開發者不光要解決程序的效率問題&#xff0c;對數據庫的快速訪問和相應也是一個大問題。希望本文能對大家掌握MySQL優化技巧有所幫助。1. 優化你的MySQL查詢緩存在MySQL服務器上進行查詢&#xff0c;可以啟用高速查詢緩存。讓數據庫引擎在后臺悄悄的處理是提高性能的最有效方…

跋山涉水——深入 Redis 字典遍歷

Redis 字典的遍歷過程邏輯比較復雜&#xff0c;互聯網上對這一塊的分析講解非常少。我也花了不少時間對源碼的細節進行了整理&#xff0c;將我個人對字典遍歷邏輯的理解呈現給各位讀者。也許讀者們對字典的遍歷過程有比我更好的理解&#xff0c;還請不吝指教。一邊遍歷一邊修改…

linux下VI模式中上下左右鍵和回退鍵出現字母

原文地址&#xff1a;http://blog.csdn.net/u012860950/article/details/50127779 ---------------------------------------------------------------- 1.編輯/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的擁有者是root用戶&#xff0c;所以要在root的權限下對這個文件進行修…

mysql數據庫查詢優化建議_mysql數據庫查詢優化的24條建議

MySQL是一個強大的開源數據庫。隨著MySQL上的應用越來越多&#xff0c;MySQL逐漸遇到了瓶頸。這里提供一些關于Mysql 數據庫查詢優化的24條優化建議&#xff0c;僅供參考。Mysql 查詢優化1、使用慢查詢日志&#xff0c;找出執行慢的查詢。2、使用 EXPLAIN 來決定查詢功能是否合…

常規sql讀取CLOB

plsql下&#xff0c;普通sqlsql-cmd下總結&#xff1a; 常規的sql&#xff0c;查詢clob字段&#xff0c;只能顯示部分內容。 查clob內容select dbms_lob.substr(c_content) from table_content t dbms_lob.substr將大文本轉換字符類型讀出來.dbms_lob.substr的轉換對字段conten…

精解 ES6箭頭函數

&#x1f431; 個人主頁&#xff1a;SHOW科技&#xff0c;公眾號&#xff1a;SHOW科技 &#x1f64b;?♂? 作者簡介&#xff1a;2020參加工作&#xff0c;專注于前端各領域技術&#xff0c;共同學習共同進步&#xff0c;一起加油呀&#xff01; &#x1f4ab;優質專欄&#x…

硬盤主引導記錄詳解

說明&#xff1a;硬盤主引導記錄獨立于操作系統&#xff0c;但又和操作系統息息相關——很多時候它又是由; 操作系統所提供的工具所生成&#xff08;例外的情況是您使用了其他的分區工具&#xff0c;不過它又運行在; 什么操作系統中呢&#xff1f;;(&#xff09;。;; 如果您安裝…

Oracle char varchar varchar2 nvarchar2 的區別

上面字符類型能保存多少個字符與oracle當前的字符集有關系。 select userenv(language) from dual; 假設長度2000字節&#xff0c; 如果字符集是16位編碼的&#xff0c;ZHS16GBK&#xff0c;那么每個字符16位&#xff0c;2字節&#xff0c;所以可以容納1000字符。 如果是32位編…

樹莓派lnmp安裝mysql_在樹莓派上安裝 LNMP

樹莓派支持安裝非常多的操作系統&#xff0c;如官方所展示&#xff1a;這里我選擇了推薦的 Raspbian 系統&#xff0c;它基于 Debian&#xff0c;這就意味著我可以按照 Debian 的方式來安裝軟件。一、安裝 Nginx0、先將系統更新到最新狀態$ sudo apt-get update && sud…

openlayers5之熱力圖heatmap

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/gisdoer/article/details/81745645 openlayers5之熱力圖 點擊查看文章

maven項目在打war包時出現非法字符: '\ufeff' 解決方案

http://blog.csdn.net/qi_fei/article/details/61416319 --------------------------------------------問題描述&#xff1a; 開發工具MyEclipse 的總體開發環境&#xff0c;編碼格式總體設置為UTF-8&#xff0c;在將web項目打包的時候出現&#xff1a;非法字符&#xff1a;\u…

0027-生成圓

題目 生成圓難度級別&#xff1a;A&#xff1b; 運行時間限制&#xff1a;1000ms&#xff1b; 運行空間限制&#xff1a;51200KB&#xff1b; 代碼長度限制&#xff1a;2000000B 試題描述給你一些特殊的圓&#xff0c;每個這樣的圓每秒可以產生一個普通的圓&#xff0c;如果給你…

mysql啟多_MySQL啟多個實例

很多朋友都想在一臺服務器上運行多個MySQL Instance&#xff0c;究竟怎么做呢&#xff1f;首先要明晰幾個原理&#xff0c; 簡稱為mysqld讀取my.cnf的順序&#xff1a;第一搜&#xff0c;首先讀取/etc/my.cnf&#xff0c;多實例這個配置文件不會存在。&#xff1a;-(第二搜&…

數據連接池druid 和 大數據框架druid

叫druid的有兩個開源項目。 一個是&#xff1a;Druid是一個JDBC組件&#xff0c;它包括三部分&#xff1a; DruidDriver 代理Driver&#xff0c;能夠提供基于Filter&#xff0d;Chain模式的插件體系。 DruidDataSource 高效可管理的數據庫連接池。 SQLParser 另一個是&#xff…

零基礎入門深度學習(5) - 循環神經網絡

往期回顧 在前面的文章系列文章中&#xff0c;我們介紹了全連接神經網絡和卷積神經網絡&#xff0c;以及它們的訓練和使用。他們都只能單獨的取處理一個個的輸入&#xff0c;前一個輸入和后一個輸入是完全沒有關系的。但是&#xff0c;某些任務需要能夠更好的處理序列的信息&am…

sql排名名次分頁mysql_mysql 實現排名及中文排序實例[分頁累加行號]

/*排名相同情況下&#xff0c;優先按姓名排序*/SELECT t.name, t.company_name, rownum:rownum1 as rankNum, t.ss from (SELECT u.name, sci.company_name, rownum:0,(u.check_numu.online_hours) as ss FROM v_user uLEFT JOIN sys_company_info sci ON u.companyId sci.com…

世上最簡單的mysql_史上最簡單安裝MySQL教程

1.安裝MySQL很多都推薦在MySQL官網進行安裝,我剛開始試的時候官網下載zip文件,打開完全找不到,踩坑了后面我發現了Windows簡易安裝,俗稱傻子都會安裝安裝好了就會看到一個這個文件安裝之前首先你的有沒有這個你就無法安裝,這個可以去這里進行下載安裝好了就可以安裝MySQL了因為…

linux下ftp配置文件詳解

# 匿名用戶配置 anonymous_enableYES # 是否允許匿名ftp,如否則選擇NO anon_upload_enableYES # 匿名用戶是否能上傳 anon_mkdir_write_enableYES # 匿名用戶是否能創建目錄 anon_other_write_enableYES # 修改文件名和刪除文件 # 本地用戶配置 …

Eclipse Maven 編譯錯誤 Dynamic Web Module 3.0 requires Java 1.6 or newer 解決方法

eclipse maven 項目報 Description Resource Path Location TypeDynamic Web Module 3.0 requires Java 1.6 or newer. bdp line 1 Maven Java EE Configuration ProblemDescription Resource Path Location Type One or more constraints have not been satisfied. bdp line 1…

帆軟按鈕控件變查詢_帆軟報表(多sheet)自定義分頁查詢

三、添加自定義按鈕以及JS事件1、打開‘模板Web屬性’2、選中‘填報頁面設置’&#xff0c;修改2)為‘為模板單獨設置‘&#xff0c;3)中是前面七個是添加的自定義按鈕&#xff1b;通過4)按鈕進行設置&#xff1b;5)操作是添加‘加載結束’事件&#xff1b;接下來詳細講述每個步…