死鎖、活鎖及飢餓

死鎖

定義

是指兩個或兩個以上的進程(或線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

產生死鎖的必要條件

  • 互斥條件:所謂互斥就是進程在某一時間內獨佔資源。
  • 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
  • 不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。
  • 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

死鎖解決方法

  1. 診斷要通過循環圖法、耗時法來判斷。
  2. 通過犧牲代價最小的事務來解除死鎖。例如撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉爲就緒狀態,以繼續運行。(但實現困難)

活鎖

定義

任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。

活鎖解決方法

  • 通過先來先服務的方式解除活鎖。
    當多個事務請求鎖定同一個數據庫對象時,系統應該按請求鎖定的先後次序對這些事務進行排隊。一旦釋放數據庫對象上的鎖,就批准請求隊列中的下一個事務的請求,使其鎖定數據庫對象,以便完成數據庫操作,及時結束事務。儘可能預防&避免。

活鎖和死鎖的區別

處於活鎖的實體是在不斷的改變狀態,所謂的“活”, 而處於死鎖的實體表現爲等待;活鎖有可能自行解開,死鎖則不能。

飢餓

定義

一個或者多個線程因爲種種原因無法獲得所需要的資源,導致一直無法執行的狀態。

Java中導致飢餓的原因

  1. 高優先級線程吞噬所有的低優先級線程的CPU時間。
  2. 線程被永久堵塞在一個等待進入同步塊的狀態,因爲其他線程總是能在它之前持續地對該同步塊進行訪問。
  3. 線程在等待一個本身也處於永久等待完成的對象(比如調用這個對象的wait方法),因爲其他線程總是被持續地獲得喚醒。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章