多執行緒死鎖 活鎖 飢餓

2022-06-27 18:39:11 字數 1378 閱讀 2464

1、死鎖:所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些程序都將無法向前推進。

理解的例子:

生活中的乙個例項,2個人一起吃飯但是只有一雙筷子,2人輪流吃(同時擁有2只筷子才能吃)。某乙個時候,乙個拿了左筷子,一人拿了右筷子,2個人都同時占用乙個資源,等待另乙個資源,這個時候甲在等待乙吃完並釋放它占有的筷子,同理,乙也在等待甲吃完並釋放它占有的筷子,這樣就陷入了乙個死迴圈,誰也無法繼續吃飯。。。

2、死鎖產生的原因:

(1)死鎖產生的條件:產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生。

a、互斥條件:執行緒要求對所分配的資源進行排他性控制,即在一段時間內某 資源僅為乙個執行緒所占有。此時若有其他程序請求該資源,則請求執行緒只能等待。

b、不剝奪條件:執行緒所獲得的資源在未使用完畢之前,不能被其他程序強行奪走,即只能由獲得該資源的執行緒自己來釋放(只能是主動釋放)。

c、請求和保持條件:執行緒已經保持了至少乙個資源,但又提出了新的資源請求,而該資源 已被其他執行緒占有,此時請求執行緒被阻塞,但對自己已獲得的資源保持不放。

d、迴圈等待條件:存在一種執行緒資源的迴圈等待鏈,鏈中每乙個執行緒已獲得的資源同時被 鏈中下乙個執行緒所請求。即存在乙個處於等待狀態的執行緒集合,其中pi等 待的資源被p(i+1)占有(i=0, 1, ..., n-1),pn等待的資源被p0占有,如圖2-15所示。

3、死鎖實現**:

/**

* 乙個簡單的死鎖類

* 當deadlock類的物件flag==1時(td1),先鎖定o1,睡眠500毫秒

* 而td1在睡眠的時候另乙個flag==0的物件(td2)執行緒啟動,先鎖定o2,睡眠500毫秒

* td1睡眠結束後需要鎖定o2才能繼續執行,而此時o2已被td2鎖定;

* td2睡眠結束後需要鎖定o1才能繼續執行,而此時o1已被td1鎖定;

* td1、td2相互等待,都需要得到對方鎖定的資源才能繼續執行,從而死鎖。

*/public

class deadlock implements

runnable

catch

(exception e)

synchronized

(o2)

} }

if (flag == 0)

catch

(exception e)

synchronized

(o1)

} }

} public

static

void

main(string args)

}

死鎖 活鎖 飢餓

1.活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。2.活鎖和死鎖的區別在於,處於活鎖的實體是在不斷的改變狀態,所謂的 活 而處於死鎖的實體表現為等待 活鎖有可能自行解開,死鎖則不能。3.活鎖可以認為是一種特殊的飢餓。下面這個例子在有的文章裡面認為是活鎖...

死鎖 活鎖 飢餓

活鎖飢餓 是指兩個或兩個以上的程序 或執行緒 在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。診斷要通過迴圈圖法 耗時法來判斷。通過犧牲代價最小的事務來解除死鎖。例如撤銷或掛起一些程序,以便 一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,...

多執行緒飢餓現象,飢餓與死鎖區別

飢餓是指系統不能保證某個程序的等待時間上界,從而使該程序長時間等待,當等待時間給程序推進和響應帶來明顯影響時,稱發生了程序飢餓。當飢餓到一定程度的程序所賦予的任務即使完成也不再具有實際意義時稱該程序被餓死。死鎖是指在多道程式系統中,一組程序中的每乙個程序都無限期等待被該組程序中的另乙個程序所占有且永...