【死鎖】死鎖的四個必要條件以及實例代碼

死鎖的造成

死鎖是指兩個或兩個以上的進程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一種阻塞的現象,若無外力做用,它們都將沒法推動下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。this

死鎖的四個必要條件

互斥

 互斥是指至少存在一個資源爲共享資源,每次只能被一個進程訪問,不能同時被用在多處地方code

佔有且等待

 佔有且等待是指進程擁有着一個資源的同時也在等待着另一個資源進程

非搶佔

 非搶佔是指該資源只能被佔有它的進程顯式釋放,不能被其餘進程強行佔有資源

循環等待

 循環等待是指每一個進程佔有的資源都被其餘進程所須要着,好比存在三個進程A、B、C,他們三個同時佔有一種資源,也同時等待着一種資源,A所等待的資源被B佔有,B所等待的資源被C佔有,C所等待的資源被A佔有,這樣就造成了一個環路,稱之爲循環等待get

死鎖案例(Java)

public class DeadLockDemo {
    
    public static void main(String[] args) {
        Print p1 = new Print("p1");
        Print p2 = new Print("p2");
        
        Thread t1 = new Thread(() -> {
            synchronized(p1) {
            
                try {
                    Thread.sleep(2000);
                    p1.print();
                } catch(Exception e) {}
                
                synchronized(p2) {
                    p2.print();
                }
            }
        });
        
        Thread t2 = new Thread(() -> {
            synchronized(p2) {
            
                try {
                    Thread.sleep(2000);
                    p2.print();
                } catch(Exception e) {}
                
                synchronized(p1) {
                    p1.print();
                }
            }
        });
        
        t1.start();
        t2.start();
    }
}

class Print {

    private String name;
    
    Print(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }

    public void print() {
        System.out.println(Thread.currentThread().getName() + " " + this.getName() + " print...");
    }
}
相關文章
相關標籤/搜索