死鎖是指兩個或兩個以上的程序在執行過程中,因爭奪資源或不正確的程序間推進順序,而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去,此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
雖然程序在執行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個必要條件。
1)互斥條件:指程序對所分配到的資源進行排它性使用,即在一段時間內,這一資源只由這乙個程序占用。如果此時還有其它程序請求該資源,則請求者只能等待,直至占有該資源的程序用畢釋放。
2)請求和保持條件:指程序已經保持至少乙個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求該資源,那麼程序被阻塞,但程序又對自己當前已獲得的其它資源保持不放。
3)不可剝奪條件:指程序已獲得的資源,在未使用完之前,不能被其他程序所剝奪,只能在使用完時,由自己釋放。
4)環路等待條件:指在發生死鎖時,必然存在乙個環形鏈,即程序集合中的p0正在等待乙個p1占用的資源;p1正在等待p2占用的資源,……,pn正在等待已被p0占用的資源。
在系統中已經出現死鎖後,應該及時檢測到死鎖的發生,並採取適當的措施來解除死鎖。目前處理死鎖的方法可歸結為以下四種:
1) 預防死鎖。
這是一種較簡單和直觀的事先預防法。方法是通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的乙個或者幾個,來預防死鎖發生。
2) 避免死鎖。
該方法同樣是屬於事先預防的策略,但它並不是去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。
3)檢測死鎖。
允許死鎖的發生,但是通過系統的檢測之後,採取一些措施,將死鎖清除掉。
4)解除死鎖。
該方法與檢測死鎖配合使用。當檢測到系統中已發生死鎖時,需要將程序從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些程序,以便**一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,以便繼續執行。
//synchronized一般情況下最好不要巢狀使用,一不小心就可能導致死鎖現象的發生
public
class
deadlock
}class
mythread1
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
synchronized
(object2)}}
}class
mythread2
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
synchronized
(object1)}}
}
請問多執行緒是什麼?
最開始,執行緒只是用於分配單個處理器的處理時間的一種工具。但假如作業系統本身支援多個處理器,那麼每個執行緒都可分配給乙個不同的處理器,真正進入 並行運算 狀態。從程式語言的角度看,多執行緒操作最有價值的特性之一就是程式設計師不必關心到底使用了多少個處理器。程式在邏輯意義上被分割為數個執行緒 假如機器...
linux多執行緒下之死鎖
出現死鎖需要同時滿足四個條件,有乙個不具備,系統就不會出現死鎖。互斥條件。即某個資源在一段時間內只能由乙個程序占有,不能同時被兩個或兩個以上的程序占有。這種獨佔資源如cd rom驅動器,印表機等等,必須在占有該資源的程序主動釋放它之後,其它程序才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就...
什麼是多執行緒,鎖,死鎖,怎麼避免死鎖
面試官問執行緒的問題,以前從來沒有總結過怎麼回答,一下子就說不出來了。回來細細總結一下,下次不能再不知道從 說起了 細思之,首先應該 了解什麼是執行緒 執行緒是資源分配的基本單位,程式執行流的最小單位。執行緒可以共用記憶體資源,多執行緒能解決cpu空閒的問題。多執行緒能夠實現併發的執行任務,提高處理...