死鎖形成的幾個必要條件
1、互斥
2、等待
3、不可搶占
4、循環等待
避免死鎖的方法就是,打破任一個必要條件。循環等待最容易打破。
科學家進餐問題。(都是在獲取左邊的鎖,)
abcde5個科學家順時針坐在圓桌上(按先獲取左邊的鎖,再去獲取右邊的)
假如 a要獲取b的鎖(right鎖),(如果a現在無法獲取b的鎖,證明b現在有左邊的鎖,而且右邊的鎖沒有被占用,b同時占用了2個鎖之后執行結束釋放左右的鎖)a在b釋放鎖之后獲取b的鎖(也就是right鎖)
簡單的鎖順序死鎖
一個操作是先獲取左邊的鎖然后獲取右邊的鎖,另一個操作先獲取右邊的鎖然后獲取左邊的鎖。
當一個線程獲取了左邊的鎖之后準備去獲取右邊的鎖,但是另一個線程獲取了右邊的鎖,正準備獲取左邊的鎖。這樣鎖都不會被釋放形成死鎖。
解決方法:
制定一個獲取鎖的順序, 兩個操作都先獲取left或者先獲取right(操作獲取鎖順序是一致的)。