產生死鎖的根本原因是兩個或者兩個以上執行緒在執行過程中,因爭搶資源而產生相互等待的一種現象。在申請鎖的時候發生了交叉閉環申請。
死鎖產生的四個條件:
1)互斥。共享資源同時只能被乙個執行緒訪問。
2)占有且等待。執行緒t1在取得共享資源a的時候,請求等待資源b的時候並不釋放資源a。
3)不可搶占。其他執行緒不能強行搶占執行緒的資源。
4)迴圈等待條件。執行緒t1在持有資源a1,同時在請求等待獲取資源b,執行緒t2在持有資源b,然後在請求等待執行緒t1的持有資源,形成了交叉閉環申請。
處理死鎖的方法可有以下4種:
1)死鎖預防。由於互斥這個條件無法避免。作業系統本身所具有的特點。可對死鎖產生的其他三個條件進行破壞。首先條件2,占有且等待,可以一次性申請所有的資源,可以破壞掉占有且等待。條件三不可搶占。當執行緒去請求其他資源時,如果獲取不到鎖,可以主動釋放自己的鎖,這樣不可搶占的條件也被破壞掉了。條件四迴圈等待條件。可以對申請的資源進行編號,按序訪問,這樣線性的去申請資源,則不會造成交叉迴圈。
2)死鎖避免。就不用去破壞形成死鎖的其他條件。在資源動態分配的過程中。用某種方法判斷防止進入不安全狀態。從而避免發生死鎖。可以使用銀行家演算法。死鎖避免的演算法會導致系統開銷的增加。
3)死鎖檢測。死鎖預防和死鎖檢測都是死鎖發生之前的預防策略。死鎖檢測是通過系統設定的檢測機構及時的判斷當前系統是否處於死鎖狀態,並精確的確定當前死鎖相關的程序和資源,執行死鎖解除策略
4)死鎖解除。這是與死鎖檢測結合使用的。它使用的方式是剝奪。就是講程序所占有的資源強行收回,分配給其他程序。
首先實現乙個死鎖演算法:
測試類:
@test
public void test()
class mythread implements runnable
@override
public void run() catch (interruptedexception e)
synchronized (o2)}}
}class mythread2 implements runnable
@override
public void run() catch (interruptedexception e)
synchronized (o1)}}
}
ARP攻擊的現象和解決辦法
最近上網,總是看到罈子上發貼說什麼 經常掉線,網速爆卡云云.當然排除各式各樣的原因不談,今天我就只針對 arp攻擊給各位談一談它的現象和解決辦法.當然本人也屬於初學者階段,難免說的有不盡人意和不準確之處,還請高手們多多指點.arp攻擊一般採用的方法為arp欺騙,也可稱之為arp木馬.至於原理我就不耽...
死鎖產生的原因和解決辦法
死鎖的條件 互斥條件 mutual exclusion 資源不能被共享,只能由乙個程序使用。請求與保持條件 hold and wait 程序已獲得了一些資源,但因請求其它資源被阻塞時,對已獲得的資源保持不放。不可搶占條件 no pre emption 有些系統資源是不可搶占的,當某個程序已獲得這種資...
死鎖的解決辦法
什麼是死鎖 在多個執行緒共享資源的時候,如果兩個執行緒分別占有一部分資源,並且同時等待對方的資源,就會成死鎖現象。如果鎖之間相互巢狀,就有可能出現死鎖。因此盡量不要出現鎖之間的巢狀。解決辦法 1.儘量減少資源占用時間,可以有效降低死鎖發生概率。2.銀行家演算法。銀行家演算法 我們可以把作業系統看作是...