死鎖&活鎖,死鎖&飢餓

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

產生死鎖的必要條件: 

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

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

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

 

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

Java中導致飢餓的原因: 

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