C++程式設計實驗二 2017/12/9
阿新 • • 發佈:2021-01-15
一、死鎖的定義
所謂死鎖是指兩個或兩個以上的執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
二、死鎖產生的原因
1.資源有限;
2.鎖巢狀;
3.不強制剝奪執行緒佔有的資源。
三、死鎖案例程式碼:
以掃描器和印表機為例,有多個執行緒爭奪這兩個共享資源的使用權
印表機類:
package cc.zxf.owner.vip.lineLock; /** * 印表機類 */ public class Print { public void printing(){ System.out.println("印表機開始工作!!!!!"); } }
掃描器類:
package cc.zxf.owner.vip.lineLock;
/**
* 掃描器類
*/
public class Scan {
public void scaning(){
System.out.println("掃描器開始工作!!!!!");
}
}
測試類:
package cc.zxf.owner.vip.lineLock; /** * 執行緒死鎖 */ public class TestDeadLock { private static Print print = new Print(); private static Scan scan = new Scan(); private static class work1 extends Thread{ @Override public void run() { System.out.println("執行緒:"+Thread.currentThread().getId()+" 開始獲取掃描器!!"); synchronized (scan){ scan.scaning(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("執行緒:"+Thread.currentThread().getId()+" 開始獲取印表機!!"); synchronized (print){ print.printing(); } } } } private static class work2 extends Thread{ @Override public void run() { System.out.println("執行緒:"+Thread.currentThread().getId()+" 開始獲取印表機!!"); synchronized (print){ print.printing(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("執行緒:"+Thread.currentThread().getId()+" 開始獲取掃描器!!"); synchronized (scan){ scan.scaning(); } } } } public static void main(String[] args){ work1 work1 = new work1(); work2 work2 = new work2(); work1.start(); work2.start(); } }
執行結果:
四、如何避免死鎖:
1、讓程式每次至多隻能獲得一個鎖。
2、設計時考慮清楚鎖的順序,儘量減少巢狀的加鎖互動數量。
3、既然死鎖的產生是兩個執行緒無限等待對方持有的鎖,那麼只要在等待時間上加個上限就好了。