Linux下Java如何查看死锁

1.首先先编写一个死锁的程序

public class Locktest extends Thread {
    Object o1;
    Object o2;
    boolean flag;
    Locktest(Object o1, Object o2, boolean flag) {
        this.o1 = o1;
        this.o2 = o2;
        this.flag = flag;
    }
    public void run() {
        while(true)
            if(flag) {
                while(true)
                    synchronized (o1) {
                        System.out.println("Flag is true,get the lock o1");

                        synchronized(o2) {
                            System.out.println("Flag is true,get the lock o2");
                        }
                    }
            } else {
                while(true)
                    synchronized (o2) {
                        System.out.println("Flag is false,get the lock o2");
                        synchronized(o1) {
                            System.out.println("Flag is false,get the lock o1");
                        }
                    }
            }

    }
    public static void main(String[] atgs) {
        Object o1 = new Object();
        Object o2 = new Object();
        Locktest test1 = new Locktest(o1, o2, true);
        Locktest test2 = new Locktest(o1, o2, false);
        test1.start();
        test2.start();
    }

}

2.运行程序得到了一下得输出,可以发现程序不再运行发生了死锁

3.在Linux终端上输入jps命令查看目标进程的PID是43400

4.通过jstack -l 43400命令查看进程的堆栈信信息,这时发现出现了死锁

可以看到线程0,1分别持有了对方等待的锁,形成了死锁

经验分享 程序员 微信小程序 职场和发展