1. 程式人生 > >一次HashMap多執行緒安全引起的事故

一次HashMap多執行緒安全引起的事故

事故分析

最近一次web工程上線,上線大概半個小時,出現了報警,16核的伺服器的cpu使用了1123%,程式出異常了。

Cpu利用率過高一般是因為出現了出現了死迴圈,導致部分執行緒一直執行。佔用cpu時間。使用jstack工具dump出問題的那臺伺服器的棧資訊。死迴圈的話,首先查詢RUNNABLE的執行緒,找到問題程式碼如下:

java.lang.Thread.State:RUNNABLE

         at java.util.HashMap.get(HashMap.java:303)

atcom.sohu.twap.service.logic.TransformTweeter.doTransformTweetT5(TransformTweeter.java:183)

共出現了23次。

java.lang.Thread.State:RUNNABLE

         at java.util.HashMap.put(HashMap.java:374)

         atcom.sohu.twap.service.logic.TransformTweeter.transformT5(TransformTweeter.java:816)

共出現了3次。

問題原因已經顯而易見。先說說這個Hashmap的使用的方法,在伺服器啟動之後,第一個訪問這個map的時候進行初始化,以後不再變化。hashmap作為TransformTweeter的static成員,也就是類成員。

關鍵程式碼:

privatestatic Map<String,String>expressionMap =newHashMap<String, String>();

先來分析初始化方法:


上面的棧資訊顯示有三個執行緒在對HashMap進行put操作,這顯然是違背了作者的本意的。看798行,expressionMap.size==0 這個判讀,在多個執行緒併發操作的的時候,可能存在(這裡用一定也不過分)多個執行緒進入這段初始化程式碼。

問題就這樣引起了,HashMap是非執行緒安全的,多個執行緒put的時候造成了某個key值Entry key List的死迴圈,問題就這麼產生了。

當另外一個執行緒get 這個Entry List 死迴圈的key的時候,這個get也會一直執行。最後結果是越來越多的執行緒死迴圈,最後導致伺服器dang掉。解決辦法也很簡單,就不多說了

我們一般認為HashMap重複插入某個值的時候,會覆蓋之前的值,這個沒錯。但是對於多執行緒訪問的時候,由於其內部實現機制,就可能出現安全問題了。正如<<併發程式設計實踐>>所說,當某個類沒有什麼是執行緒安全的時候,就認為它是非執行緒安全的。

對HaspMap死迴圈原因分析

有人已經做出了分析,我就不在大費周章了。連結如下:

相關推薦

HashMap執行安全引起事故

事故分析 最近一次web工程上線,上線大概半個小時,出現了報警,16核的伺服器的cpu使用了1123%,程式出異常了。 Cpu利用率過高一般是因為出現了出現了死迴圈,導致部分執行緒一直執行。佔用cpu時間。使用jstack工具dump出問題的那臺伺服器的棧資訊。死迴圈的話

python執行+Queue的坑逼之旅

背景~ 在爬蟲中,需要用到代理ip,本人寫了一個模組來獲取和過濾代理ip(用多執行緒過濾,),,,在主執行緒中判斷可用的代理ip少於一定值了,獲取新的可用ip,問題來了。。多次呼叫代理ip模組之後報錯: can't start new thread                         !!!!!!

HashMap執行安全

事故分析 最近一次web工程上線,上線大概半個小時,出現了報警,16核的伺服器的cpu使用了1123%,程式出異常了。 Cpu利用率過高一般是因為出現了出現了死迴圈,導致部分執行緒一直執行。佔用cpu時間。使用jstack工具dump出問題的那臺伺服器的棧資

執行安全的單例模式

template <typename T> class StaticSingletonT { public: static T* SafeInstance() { static T* s_instance_ptr = NULL; if (!s_i

2018-08-28微服務筆記()之執行

1.多執行緒 1.1 程序與執行緒 (1)程序:正在執行的程式,是執行緒的集合。主執行緒決定程式碼的執行順序。 (2)執行緒:正在獨立執行的一條執行路徑。 (3)多執行緒:為了提高程式的效率。 1.2 四種方式建立執行緒 (1)繼承Thread類 (2)實現Runnable介面

SpringBoot實戰實現分散式鎖之重現執行高併發場景

實戰前言:上篇博文我總體介紹了我這套視訊課程:“SpringBoot實戰實現分散式鎖” 總體涉及的內容,從本篇文章開始,我將開始介紹其中涉及到的相關知識要點,感興趣的小夥伴可以關注關注學習學習!!工欲善其事,必先利其器,介紹分散式鎖使用的前因後果之前,得先想辦法說清楚為啥需要分散式鎖以及

Java執行-45-執行安全問題--火車票賣票

這篇通過火車票賣票來逐步演示多執行緒的安全問題,加入一共賣100張火車票,分成4個視窗賣。也就是,四個視窗就是4個執行緒,如何保證4個視窗賣票都正確。 1.先實現4個視窗賣票的程式碼 package thread; public class Demo3_Ticket { publi

Java執行---執行安全問題

   上一次我們說到在賣票問題中如果不將總票數設定為static靜態變數,就會出現錯票,     即同樣一張票會出售多次。     在今天的問題中,我們繼續通過賣票問題來進行研究。     我們在每一個執行緒進行判斷條件後讓

實現執行安全的3種方式

實現多執行緒安全的3種方式   1、先來了解一下:為什麼多執行緒併發是不安全的?   在作業系統中,執行緒是不擁有資源的,程序是擁有資源的。而執行緒是由程序建立的,一個程序可以建立多個執行緒,這些執行緒共享著程序中的資源。所以,當執行緒一起併發執行時,同時對一個數據進行修改,就

執行安全問題之Lock顯示鎖

package com.hls.juc;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 解決多執行緒安全問題的方式: 3種 * synchronized: 隱式鎖 * 1.

HashMap執行問題

hashMap的初始容量預設16,負載因子預設0.75。前者預設最好為2的n次方,因為此時空間利用率高,衝突概率小。 rehash是為了維持負載因子在一定程度,儘量減少衝突,對雜湊表進行擴容收縮操作。 https://www.cnblogs.com/yesiamhere/p/6653135.

HashMap執行環境下的死迴圈問題解釋

hashMap在多執行緒環境下,呼叫put方法出現的死迴圈是由於擴容時候resize方法導致的連結串列出現迴圈。 void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity =

如何用SingleThreadModel解決執行安全問題

2.用SingleThreadModel解決多執行緒安全問題: 前 面介紹的都是普通的Servlet。對於每一個使用者請求,那些Servlet都會用執行緒的方式給予應答。這樣比較節省系統的資源。Sun公司也給出了另外 一種方法,就是這節要介紹的SingleThreadModel的方法。當impl

如何用Synchronied解決Servlet執行安全問題?

1.用Synchronied解決多執行緒安全問題: 馬 克-to-win:我們先鋪墊Servlet的多執行緒基礎知識。到現在為止,我們所接觸到的Servlet都是這樣的:第一個人訪問Servlet的時 候,Servlet會被例項化。之後的人再訪問這個Servlet的時候,這個Servlet就不再

Java之執行安全(屌絲版,兩大解決思路,要麼不去競爭(開闢執行副本)、要麼有順序的競爭資源(用鎖規定執行秩序))

0、多執行緒安全,如果多個執行緒操作一個變數,每次都能達到預期的結果,那麼說明當前這個類起碼是執行緒安全的,我這白話的,可能有點噁心。   1、看看牛人是怎麼說的,為什麼多執行緒併發是不安全的? 在作業系統中,執行緒是不再擁有資源的,程序是擁有資源的。而執行緒是由程序建立的

java虛擬機器執行安全的簡單理解

java虛擬機器多執行緒安全及鎖優化 執行緒安全問題的產生 多執行緒技術的引入產生啦執行緒安全性問題:當多個執行緒操作共享的資料時,如果A執行緒對共享的資料做出改變時B執行緒也要操作共享的資料,就有可能發生執行緒執行錯誤,產生錯誤的結果. 執行緒安全按安全程度來分五級

JAVA執行安全的三大特性 + synchronized和volatile

文章目錄 執行緒安全的三大特性 原子性 可見性 有序性 保證執行緒安全的兩個關鍵字 Synchronized Volatile 執行緒安全的三大特性 在多執行緒程式設計中

執行學習筆記 ——為什麼使用執行

(1)更多的處理器核心 隨著處理器上的核心數量越來越多,以及超執行緒技術的廣泛運用,現在大多數計算機都 比以往更加擅長平行計算,而處理器效能的提升方式,也從更高的主頻向更多的核心發展。如 何利用好處理器上的多個核心也成了現在的主要問題。 執行緒是大多數作業系統排程的基

執行安全問題解決之顯示鎖Lock

【1】顯示鎖和隱式鎖 在Java 5.0 之前,協調共享物件的訪問時可以使用的機制只有synchronized 和volatile 。Java 5.0 後增加了一些新的機制,但並不是一種替代內建鎖的方

#Java&面試--控制執行安全與順序執行

Condition類的signal則是喚醒被Condition類使用await作用的那個執行緒,它會有針對性的喚醒執行緒,而不是隨機喚醒一個執行緒,以保證執行緒執行的順序: package com.yzh.job.test; import java.util.c