原來,JDK8的ConcurrentHashMap也會造成CPU 100%
阿新 • • 發佈:2019-01-10
文章概要
大家可能都聽過JDK7中的HashMap在多執行緒環境下可能造成CPU 100%的現象,這個由於在擴容的時候put時產生了死鏈,由此會在get時造成了CPU 100%。這個問題在JDK8中的HashMap獲得瞭解決。
傳送門:HashMap死迴圈分析的修正版
其實JDK7中的HashMap在多執行緒環境下不止只有CPU 100%這一共怪異現象,它還可能造成插入的資料丟失,有興趣的讀者可以自行了解下。
對於HashMap多執行緒的問題,我們通常會這麼反問:HashMap設計上就不是多執行緒安全的,何必要去在多執行緒環境下用呢?的確如此,我們不會傻到顯式的在多執行緒環境下呼叫,但是又可能在你所關注的視角範圍外是多執行緒的,其隱式地讓HashMap置於多執行緒環境下了,這個又難以一下子察覺到。再者,對於HashMap多執行緒的問題,我們很多時候推薦使用ConcurrentHashMap來代替HashMap應用於多執行緒的環境,很不巧的是ConcurrentHashMap也有可能會造成CPU 100%的異常現象。這個怪異現象存在於JDK8的ConcurrentHashMap中,在JDK9中已經得到修復
https://bugs.openjdk.java.net/browse/JDK-8062841