转载

死锁的四个必要条件以及实例代码

死锁的形成

  死锁 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁的四个必要条件

互斥

 互斥是指至少存在一个资源为共享资源,每次只能被一个进程访问,不能同时被用在多处地方

占有且等待

 占有且等待是指进程拥有着一个资源的同时也在等待着另外一个资源

非抢占

 非抢占是指该资源只能被占有它的进程显式释放,不能被其他进程强行占有

循环等待

 循环等待是指每个进程占有的资源都被其他进程所需要着,比如存在三个进程A、B、C,他们三个同时占有一种资源,也同时等待着一种资源,A所等待的资源被B占有,B所等待的资源被C占有,C所等待的资源被A占有,这样就形成了一个环路,称之为循环等待

死锁案例(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...");
    }
}
原文  https://segmentfault.com/a/1190000020418574
正文到此结束
Loading...