併發程式設計之死鎖

2022-07-03 08:09:10 字數 1688 閱讀 7744

產生死鎖的4個必要條件

產生死鎖的情況

交叉鎖引起的執行緒會進入blocked狀態,cpu資源棧用不高,很容易借助工具發現

情景描述:執行緒a持有鎖1,等待獲取鎖2;執行緒b持有鎖2,等待獲取鎖1。

private

final

static object mutex_read = new

object();

private

final

static object mutex_write = new

object();

public

void

read()

}}public

void

write()

}}

伺服器開啟了某個埠,等待客戶端的訪問。客戶端傳送請求後等待伺服器的響應,伺服器因為某種原因錯過了客戶端的請求,讓在等待請求。此時,服務端可客戶端都在等待對方傳送資料。

比如某個執行緒執行了for update語句後退出了事務,其他執行緒訪問的時候就會陷入死鎖

獲取檔案鎖的執行緒意外退出,其它執行緒無法獲取該檔案鎖會進入死鎖。

處理死鎖的方法

通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的乙個或幾個條件,來防止死鎖的發生。【在死鎖產生的四個必要條件中,「互斥條件」是無法破壞的,破壞「互斥條件」會造成結果的不可再現性】

允許對資源實行搶奪。

方法一:如果占有某些資源的乙個執行緒進行進一步資源請求被拒絕,則該執行緒必須釋放它最初占有的資源【如果有需要,可再次請求這些資源和另外的資源】。

方法二:允許優先順序高的執行緒搶占優先順序低的執行緒的資源。

在系統中不允許程序在已獲得某種資源的情況下,申請其他資源。

方法一:採用「 一次性分配」方案,即:建立程序時,要求它申請所需的全部資源,系統或滿足其所有要求,或什麼也不給它。

方法二:要求每個程序提出新的資源申請前,釋放它所占有的資源。

將系統中的所有資源進行編號,執行緒必須按照順序申請資源。

避免死鎖的處理方式

執行緒a等待執行緒b,執行緒b等待執行緒c,執行緒c等待執行緒d,執行緒d又在等待執行緒a。執行緒a為了檢測死鎖,它需要遞進地檢測所有被b請求的鎖。從執行緒b所請求的鎖開始,執行緒a找到了執行緒c,然後又找到了執行緒d,發現執行緒d請求的鎖被執行緒a自己持有著。這是它就知道發生了死鎖。

檢測和解除死鎖

由於作業系統有併發、共享以及隨機性等特點,通過預防和避免的手段達到排除死鎖的目的是很困難的。一種簡便的方法是系統為程序分配資源時,不採取任何限制性措施,但是提供了檢測和解脫死鎖的手段:能發現死鎖並從死鎖狀態中恢復出來。因此,在實際的作業系統中往往採用死鎖的檢測和解除方法來排除死鎖。

死鎖檢測和解除是指系統設有專門的機制,當死鎖發生時,該機制能夠檢測到死鎖發生的位置和原因,並能通過外力破壞死鎖發生的必要條件,從而使得併發程序從死鎖狀態中恢復出來。

1) 資源剝奪法:掛起某些死鎖程序,並釋放它的資源,將這些資源分配給其他的死鎖程序。【但應防止被掛起的程序長時間得不到資源,而處於資源匱乏的狀態】

2) 撤銷執行緒法:強制撤銷部分、甚至全部死鎖執行緒。【撤銷的原則可以按程序優先順序和撤銷程序代價的高低進行】

3) 程序回退法:讓一(多)個執行緒回退到足以迴避死鎖的地步【要求系統保持程序的歷史資訊,設定還原點】

linux C程式設計之死鎖

死鎖 死鎖就是你和小明打架,互相掐住對方脖子,你們都說 你先放 結果誰都不放,死鎖了.在程式裡面,有兩個鎖,a執行緒鎖住第乙個,b執行緒鎖住了第二個,這時如果a再試圖鎖第二個,失敗,因為b已經鎖住了,a只能等待.就在這時b試圖鎖第乙個,結果失敗,因為a已經鎖住了,b只好等待.就這樣大家一直等下去,誰...

多執行緒之死鎖

1 死鎖發生的場景 有時候兩個或者多個執行緒需要訪問同乙份資源,這裡就涉及到執行緒同步的問題 thread1 synchronized object1 thread2 synchronized object2 看看上面的例子,兩個執行緒各自都有想要訪問對方的想法,可是雙方都不願意放手,就像a拿到了開...

多執行緒之死鎖

死鎖。同步中巢狀同步。你有一根筷子,我有一根筷子,我要吃飯,你不給我,我不給你,誰都吃不著飯,死鎖發生,但是死鎖不一會發生,也會存在和諧的狀態,就是你把筷子給我,我吃一口,我再把筷子給你,你再吃一口 class ticket implements runnable else while true s...