使用single threaded execution pattern 時,可能會有發生死鎖(deadlock)的危險。
所謂的死鎖,是指兩個執行緒分別獲取了鎖定,互相等待另乙個執行緒解除鎖定的現象。發生死鎖時,那個執行緒都無法繼續執行下去,所以程式會失去生命性。
來舉個例子吧。假設alice 與bobby 同吃乙個盤子所盛放的中國麵條,盤子的旁邊只用乙隻湯匙與一支叉子,而要吃麵條時,同時需要用到湯匙與叉子。
只有一支的湯匙,被alice 拿去了,而只有一支的叉子,卻被bobby 拿走了。就造成以下的情況:
這麼一來alice與bobby 只有面面相覷,就這樣不動了。像這樣,多個執行緒僵持不下,使執行緒無法繼續執行的狀態,就稱為死鎖。
single threaded execution 達到下面這些條件時,可能會出現死鎖的現象。
具有多個sharedresource 參與者。
執行緒鎖定乙個sharedresource時,還沒有解除就去鎖定另乙個sharedresource.
獲取sharedresource 參與者的順序不固定(和sharedresource參與者是對等的)
如何解除死鎖??
回頭看看前面吃不到中國面的兩個人這個例子。
多個sharedresource 參與者,相當於湯匙與叉子。
鎖定某個sharedresource參與者後,就去鎖定其他sharedresource.就相當於握著湯匙而想要獲取對方的叉子,或握著叉子而想要獲取對方的湯匙這些操作。
sharedresource 角色是對等的,就像「拿湯匙——》拿叉子」與「拿叉子——》拿湯匙」兩個操作都可能發生。也就是說在這裡湯匙與叉子並沒有優先順序。
(1) 、(2)、(3) 中只要破壞一種條件,就可以避免死鎖的發生。
多執行緒中的死鎖
一 死鎖 所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局 互相等待 若無外力作用,這些程序都無法向前推進。二 如何避免死鎖 1 加鎖順序 執行緒按照一定的順序加鎖 本例就是採用這種方法 2 加鎖時限 執行緒嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己占有的鎖 例如本例中的...
簡析 JSON 中的 與
在 json 裡 是 array 也就是陣列 是ojbect 也就是物件 array 的key 是 int.的key 是 string 例如 var dot1 a 就是乙個陣列 var dot2 就是乙個物件 陣列和物件轉換非常簡單,dot1把 替換為 就是物件,dot2把替換為 就是素組。這在jq...
手寫多執行緒中的死鎖問題
在使用多執行緒時,有這麼一種情況 有兩個執行緒 執行緒a 執行緒b 有兩個物件鎖 locka lockb 當執行緒a想要去執行共享資料時,需要先獲取到locka物件鎖,再獲取到lockb物件鎖後,才可以去操作共享資料。當執行緒b想要去執行共享資料時,需要先獲取到lockb物件鎖,再獲取到locka物...