1. 程式人生 > 其它 >C++程式設計實驗二 2017/12/9

C++程式設計實驗二 2017/12/9

技術標籤:JAVA多執行緒thread併發程式設計多程序

一、死鎖的定義

所謂死鎖是指兩個或兩個以上的執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

二、死鎖產生的原因

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、既然死鎖的產生是兩個執行緒無限等待對方持有的鎖,那麼只要在等待時間上加個上限就好了。