Java——多线程(死锁)

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

同步代码块不要嵌套,因为,嵌套容易死锁,避免死锁的出现,不要进行同步代码块的嵌套

package com.yy.syn;
//只有获得到一双筷子才可以吃
public class Demo5_DeadLock {
    private static String s1 = "筷子1";
    private static String s2 = "筷子2";

    public static void main(String[] args) {
        new Thread(){                               //第一个线程Thread-0,在上面,所以,它先开启,先开始执行,执行的机会多
            public void run(){
                    while(true){
                        synchronized (s1) {         //系统先拿到s1
                        System.out.println(getName() + "...获取" + s1 + "等待" + s2 );//之后,执行这句话
                        synchronized (s2) {         //正准备获取s2的时候,第二条线程启动
                            System.out.println(getName() + "...拿到" + s2 +"开吃" );
                        }
                    }
                }
            }
        }.start();

        new Thread(){
            public void run(){
                    while(true){
                        synchronized (s2) {         //第二条线程获取到s2
                        System.out.println(getName() + "...获取" + s2 + "等待" + s1 );//之后,执行这句话
                        synchronized (s1) {         //然后,再准备去获取s1,但是s1已经被第一条线程获取,第一条线程并未释放s1
                            System.out.println(getName() + "...拿到" + s1 +"开吃" );
                        }
                    }
                }
            }
        }.start();
    }
}
//之后,第一条线程获得了s1,第二条线程获取了s2,第一条线程想获取s2,但是,s2被第二条线程所获取,而第二条线程想获取s1,但是s1被第一条线程所获取,所以,两条线程开始僵持,最后造成死锁
//但是,也会有一种发生概率极低的情况,一种理想状态,即 第一条线程先拿到s1然后输出一句话,然后再拿到s2输出一句话,然后再释放s1,释放s2;然后,第二条线程开始获取s2,输出,然后再获取s1,输出

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/81261775