死锁

50 阅读1分钟

死锁 :

死锁 互相持有对方的锁,互相等待对方释放锁,然后一直等下去,这个就是死锁。

比如:
两个线程 s1 s2互相获取o1,o2锁 让其睡眠 4s 然后在互相获取对方的锁,这时候 o1,o2已经被s1,s2所占用,此时处于等待所释放,然后就一直等下去。产生死锁

public class DeadLock {

    private static Object o1 = new Object();
    private static Object o2 = new Object();

    public static void main(String[] args) {
        new Thread("s1"){
            @Override
            public void run() {

                synchronized (o1){
                    System.out.println(" s1 get o1");

                    try {
                        Thread.sleep(4_000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }


                    synchronized (o2){
                        System.out.println(" s1 get o1");
                    }

                }
            }
        }.start();


        new Thread("s2"){
            @Override
            public void run() {

                synchronized (o2){
                    System.out.println(" s2 get o2");

                    try {
                        Thread.sleep(4_000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }


                    synchronized (o1){
                        System.out.println(" s2 get o1");
                    }

                }
            }
        }.start();
    }
    
}

有时候,出现死锁情况我们无法定位问题,这时候我们可以使用jdk自带的一些工具

如jps查看进程id
jps
在这里插入图片描述
可以看到 DeadLock 和这个类在运行当中

然后再根据进程id查看 堆栈信息
jstack + 空格 + 进程id

jstack 5604
在这里插入图片描述

可以看到一些信息 found deadlock 发现一个死锁

两个线程 s1 s2
互相在等待对方的释放锁
互相拿到了o1,o2对象的锁