這篇文章給大家分享的是有關(guān)JDK7的HashMap和JDK8的ConcurrentHashMap造成CPU 100%的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)建站專注于運城企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,電子商務(wù)商城網(wǎng)站建設(shè)。運城網(wǎng)站建設(shè)公司,為運城等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站制作,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
大家可能都聽過JDK7中的HashMap在多線程環(huán)境下可能造成CPU 100%的現(xiàn)象,這個由于在擴容的時候put時產(chǎn)生了死鏈,由此會在get時造成了CPU 100%。這個問題在JDK8中的HashMap獲得了解決。其實JDK7中的HashMap在多線程環(huán)境下不止只有CPU 100%這一共怪異現(xiàn)象,它還可能造成插入的數(shù)據(jù)丟失。
對于HashMap多線程的問題,我們通常會這么反問:HashMap設(shè)計上就不是多線程安全的,何必要去在多線程環(huán)境下用呢?的確如此,我們不會傻到顯式的在多線程環(huán)境下調(diào)用,但是又可能在你所關(guān)注的視角范圍外是多線程的,其隱式地讓HashMap置于多線程環(huán)境下了,這個又難以一下子察覺到。再者,對于HashMap多線程的問題,我們很多時候推薦使用ConcurrentHashMap來代替HashMap應(yīng)用于多線程的環(huán)境,很不巧的是ConcurrentHashMap也有可能會造成CPU 100%的異?,F(xiàn)象。這個怪異現(xiàn)象存在于JDK8的ConcurrentHashMap中,在JDK9中已經(jīng)得到修復(fù),可以參見:https://bugs.openjdk.java.net/browse/JDK-8062841
什么情況下JDK8的ConcurrentHashMap會出現(xiàn)這個Bug呢?首先我們來運行一下這段代碼:
Map<String, String> map = new ConcurrentHashMap<>();
map.computeIfAbsent("AaAa",
key -> map.
computeIfAbsent("BBBB", key2 -> "value"));
你會驚奇的發(fā)現(xiàn)這個程序一直處于Running狀態(tài),我們通過top -Hp [pid]命令查看到其中一個線程的CPU使用率接近100%,參考下圖:
可以看到pid為31417的東東,我們再通過jstack -l [pid]命令查看到對應(yīng)的線程為:
注意將nid=0x7ab9的16進(jìn)制轉(zhuǎn)為10進(jìn)制就是31417??梢钥吹絾栴}是發(fā)生在了computeIfAbsent方法中,我們將示例中的程序換成下面這段程序也會同樣出現(xiàn)CPU 100%的Bug:
map.computeIfAbsent("AaAa",
(String key) -> {
map.put("BBBB", "value");
return "value";
});
問題的關(guān)鍵在于遞歸使用了computeIfAbsent方法,筆者在stackoverflow上還搜索到了同類型的問題,下面的示例程序中調(diào)用fibonacci方法同樣也會造成CPU 100%.
static Map<Integer, Integer> concurrentMap = new ConcurrentHashMap<>();
public static void main(String[] args) {
System.out.println("Fibonacci result for 20 is" + fibonacci(20));
}
static int fibonacci(int i) {
if (i == 0)
return i;
if (i == 1)
return 1;
return concurrentMap.computeIfAbsent(i, (key) -> {
System.out.println("Value is " + key);
return fibonacci(i - 2) + fibonacci(i - 1);
});
}
感謝各位的閱讀!關(guān)于“JDK7的HashMap和JDK8的ConcurrentHashMap造成CPU 100%的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
當(dāng)前標(biāo)題:JDK7的HashMap和JDK8的ConcurrentHashMap造成CPU100%的示例分析
網(wǎng)站網(wǎng)址:http://chinadenli.net/article38/pijgpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)、網(wǎng)站策劃、定制開發(fā)、網(wǎng)站排名、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)