java死鎖的原因及解決辦法

1.什麼是死鎖

所謂死鎖是指多個進程在運行過程中因爭奪資源而造成的一種僵局,當進程處於這種僵局狀態時,若無外力作用,它們都將無法再向前推進。

例:如果有個線程a,按照先鎖a再鎖b的順序獲取得鎖,在此同時又有另一個線程b,按照先鎖b再鎖a的順序獲取鎖。

2.產生死鎖的原因

1.系統資源不足;

2.進程推進順序不合適;

3.資源分配不當;

3.死鎖產生的必要條件

  1. 互斥使用:即當資源被一個線程使用(佔有)時,別的線程不能使用
  2. 不可搶佔:資源的請求者不能強制從資源的佔有者手中獲取資源,資源只能由佔有者主動釋放
  3. 請求和保持:資源的請求者在請求其他資源的同時保持對原有資源的佔有
  4. 循環等待:即存在一個等待隊列:P1佔有P2的資源,P2佔有P3的資源,P3佔有P1的資源。這樣就形成了一個等待環路

4.解決死鎖的辦法

  1. 加鎖順序:能確保所有的線程都是按照相同的順序獲得鎖,那麼死鎖就不會發生
  2. 加鎖時限:線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己佔有的鎖
  3. 死鎖檢測:JConsole工具對運行的資源和性能進行監控

5.代碼角度:

一種是用synchronized,一種是用Lock顯式鎖實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章