06.20 2018java面試進階-多線程死鎖手寫案例及解決死鎖方案

面試題1、什麼情況下導致線程死鎖,遇到線程死鎖該怎麼解決?(代碼案例說明)

分析:所謂的線程死鎖是指多個線程因競爭資源而造成的一種僵局(即相互等待),若無外力作用,這些進程都將無法向前推進。如下圖產生線程死鎖的一個例子:

2018java面試進階-多線程死鎖手寫案例及解決死鎖方案

面試題1:線程死鎖案例

上圖代碼運行後,會處於線程o1等待線程o2,線程o2又等待線程o1釋放資源,所以處於相互等待的狀態,即程序也就產生線程死鎖。那麼如何解決才能避免死鎖的產生呢?在有些情況下的死鎖是可以避免的,兩種用於避免死鎖的技術:

1、加鎖順序(線程按照一定的順序加鎖),實現代碼如下:

2018java面試進階-多線程死鎖手寫案例及解決死鎖方案

防止死鎖

2018java面試進階-多線程死鎖手寫案例及解決死鎖方案

防止死鎖運行效果圖

防死鎖的方式2:加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己佔有的鎖),案例代碼如下圖:

2018java面試進階-多線程死鎖手寫案例及解決死鎖方案

解決線程死鎖方式二

2018java面試進階-多線程死鎖手寫案例及解決死鎖方案

方式2運行效果圖

2018java面試進階-多線程死鎖手寫案例及解決死鎖方案


分享到:


相關文章: