iv011 死鎖編碼及定位分析

2022-07-03 10:12:12 字數 1694 閱讀 6377

死鎖是指兩個或兩個以上的執行緒在執行過程中,因爭奪資源而造成的一種相互等待的現象,若無外力干涉那它們都將無法推進下去,如果系統資源充足,執行緒的資源請求都能得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。

可歸結為如下兩點:

1.以確定的順序獲得鎖

如果必須獲取多個鎖,那麼在設計的時候需要充分考慮不同執行緒之前獲得鎖的順序。按照上面的例子,兩個執行緒獲得鎖的時序圖如下:

如果此時把獲得鎖的時序改成:

那麼死鎖就永遠不會發生。 針對兩個特定的鎖,開發者可以嘗試按照鎖物件的hashcode值大小的順序,分別獲得兩個鎖,這樣鎖總是會以特定的順序獲得鎖,那麼死鎖也不會發生。問題變得更加複雜一些,如果此時有多個執行緒,都在競爭不同的鎖,簡單按照鎖物件的hashcode進行排序(單純按照hashcode順序排序會出現「環路等待」),可能就無法滿足要求了,這個時候開發者可以使用銀行家演算法,所有的鎖都按照特定的順序獲取,同樣可以防止死鎖的發生,該演算法在這裡就不再贅述了,有興趣的可以自行了解一下。

當發現有程序死鎖後,便應立即把它從死鎖狀態中解脫出來,常採用的方法有:

案例一:

class mythread implements runnable 

@override

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + "\t 獲得locka 嘗試獲得lockb");

synchronized (lockb) }}

}}public class deallockdemo01

}

案例二:

class a  catch (interruptedexception e) 

system.out.println(thread.currentthread().getname() + "\t 獲得a的鎖");

b.b2();

}public synchronized void a2()

}class b catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + "\t 獲得b的鎖");