多线程某个线程异常了怎么处理_技术分享|Java多线程之高并发处理
黃? 靜
合肥科技研發中心
進程與線程的簡介
(1)?進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,即進程空間或(虛空間)。
(2)?線程是指進程中的一個執行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬于某個進程,沒有自己獨立的虛擬地址空間,與進程內的其他線程一起共享該進程的所有資源。
(3)?進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大的提高了程序的運行效率:
從執行角度來看,線程不能夠獨立執行,必須依存于進程,由進程提供多個線程執行。
從邏輯角度來看,多線程的意義在于一個進程中,有多個執行流程可以同時執行。
線程生命周期的簡介
(1)?一個線程被創建之后,進入新建狀態,JVM則給他分配內存空間,并進行初始化操作。
(2)?當線程對象調用了start()方法,該線程處于就緒狀態(即可執行狀態),JVM會為其創建方法調用棧和程序計數器,處于可執行狀態下的線程隨時可以被CPU調度執行。CPU執行該線程的時候,該線程進入執行狀態。
(3)?執行過程中,該線程遇到wait()方法進入等待狀態;當線程調用同步方法時,在沒有獲取到鎖的情況下,進入阻塞狀態。
(4)?進入等待狀態或阻塞狀態后,可通過notify()或者notifyAll()方法喚醒,重新獲取對象鎖之后再進入就緒狀態,等待CPU調度進入執行狀態。
(5)?當線程執行完或者return線程正常結束。如果運行時發生未經處理的異常,則線程因為異常而結束。
用流程圖直觀的描述如下:
Java多線程風險
(1)?安全性問題:會存在如下安全問題:內存共享、指令重排序、并行運行、操作順序不可預測、會在串行編程模型中引入非串行因素,產生奇怪的結果等。例如經典賬戶存取款案例,如下:
從運行結果來看,賬戶只有100,分別取錢2次,金額分別是80和90,最后賬戶的余額還是10,產生了線程不安全問題。
(2)?活躍性問題:在串行程序中,無意中發生的無限循環,使得程序不能按照設計的流程繼續執行,無法執行后面的代碼,或者由于資源競爭而導致的死鎖等。例如,如果線程1在等待線程2釋放其持有的資源,而線程2永遠不釋放該資源,那么A就會永久地等待下去。
(3)?性能問題:在多線程程序中,不僅存在單線程程序相同的性能問題,而且還存在由于使用線程而引入的其他性能問題。例如服務時間過長,響應不靈敏,吞吐率過低,資源消耗過高,或者可伸縮性較低等。
多線程高并發風險處理方案
(1)?修改線程模型:不在線程之間共享該狀態變量。
(2)?同步機制:通過synchronize和Lock可以實現同步,即當某一線程修改或訪問可變變量時加鎖,獨占對象,讓其他線程進不來。但是該方法容易造成死鎖,所以要設計合理的釋放鎖的機制。
(3)?使用線程池:重用存在的線程,減少對象創建消亡的開銷,可有效的控制最大并發線程數,提高系統資源利用率。
(4)?使用線程安全類:例如HashTable、StringBuffer都是線程安全的。
(5)?設計線程安全類:越早設計線程安全類,后期花費的代價就越小。設計線程安全類時,一般有如下流程:
找出構成對象狀態的所有變量;
找出約束狀態變量的不變性條件;
建立對象狀態的并發訪問管理策略:java監聽器模式或線程安全委托。
寫在最后
多線程高并發需要良好的設計來提升線程的性能,但無論如何線程總會帶來額外的開銷,本文意在讓大家對線程高并發有一個初步的認識,深入學習還需要不斷積累。
總結
以上是生活随笔為你收集整理的多线程某个线程异常了怎么处理_技术分享|Java多线程之高并发处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 忽略某些文件 —— Git 学习笔记 0
- 下一篇: git status 命令总结 —— G