Java學習 30 併發程式設計(執行緒安全)

2021-09-24 07:23:04 字數 1128 閱讀 4951

死鎖概念及產生原理

概念:多個併發程序因爭奪系統資源而產生相互等待的現象。

原理:當一組程序中的每個程序都在等待某個事件發生,而只有這組程序中的其他程序才能觸發該事件,這就稱這組程序發生了死鎖。

本質原因

1)、系統資源有限。

2)、程序推進順序不合理。

死鎖產生的4個必要條件

1、互斥:某種資源一次只允許乙個程序訪問,即該資源一旦分配給某個程序,其他程序就不能再訪問,直到該程序訪問結束。

2、占有且等待:乙個程序本身占有資源(一種或多種),同時還有資源未得到滿足,正在等待其他程序釋放該資源。

3、不可搶占:別人已經占有了某項資源,你不能因為自己也需要該資源,就去把別人的資源搶過來。

4、迴圈等待:存在乙個程序鏈,使得每個程序都占有下乙個程序所需的至少一種資源。

當以上四個條件均滿足,必然會造成死鎖,發生死鎖的程序無法進行下去,它們所持有的資源也無法釋放。這樣會導致cpu的吞吐量下降。所以死鎖情況是會浪費系統資源和影響計算機的使用效能的。那麼,解決死鎖問題就是相當有必要的了。

利用jstack定位死鎖

(1)、 在cmd視窗,使用jps指令查詢該類的埠號(3408)

(2)、再使用 jstack + 埠號檢視日誌(jstack 3408):

發現出現死鎖,並且該日誌也定位了出現死鎖的位置,接下來就是進行修復工作了!

tip:在實際應用中,死鎖情況未必有如此清晰的輸出,但是總體上的分析步驟為: 

區分執行緒狀態 -> 檢視等待目標 -> 對比 monitor 等持有狀態

請參考:

java併發程式設計學習11 執行緒池

執行緒池 為了節省系統在多執行緒併發時不斷建立和銷毀執行緒帶來的額外開銷,就需要引入執行緒池。執行緒池的基本功能就是進行執行緒的復用。當系統接受一 個提交的任務時,並不會著急去建立乙個新的執行緒去執行這個任務,而是去執行緒池中查詢是否有空閒的執行緒。若有 直接使用這個執行緒。若沒有 根據配置的策略執...

java併發程式設計 執行緒封閉

執行緒封閉有三種方式 ad hoc執行緒封閉 棧封閉 threadlocal類 其中ad hoc執行緒封閉一般由程式設計師自己實現,很少用,暫不介紹。將物件封閉在區域性變數中,只有區域性變數才能訪問,保證執行緒安全。下面我們來看一段簡單的 public class animals return nu...

Java併發程式設計 執行緒通訊

1.wait和notify方法 配合synchronize使用,屬於object方法 private volatile static list list new arraylist public void add public int size public static void main str...