Java死锁简单检测

死锁

死锁是两个或两个以上的线程在竞争资源而导致的,下面给出一个简单地例子。

/**
 * created by Yinevg on 2018/12/29
 */
public class Main {

    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        ThreadA threadA = new ThreadA(lock1, lock2);
        ThreadB threadB = new ThreadB(lock1, lock2);
        threadA.start();
        threadB.start();
    }
}

class ThreadA extends Thread {

    private Object lock1;
    private Object lock2;

    ThreadA(Object lock1, Object lock2) {
        super();
        this.lock1 = lock1;
        this.lock2 = lock2;
    }

    @Override
    public void run() {
        synchronized (lock1) {
            System.out.println("ThreadA gets lock1");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lock2) {
                System.out.println("ThreadA gets lock2");
            }
            System.out.println("ThreadA releases lock2");
        }
        System.out.println("ThreadA releases lock1");
    }
}

class ThreadB extends Thread {

    private Object lock1;
    private Object lock2;

    ThreadB(Object lock1, Object lock2) {
        super();
        this.lock1 = lock1;
        this.lock2 = lock2;
    }

    @Override
    public void run() {
        synchronized (lock2) {
            System.out.println("ThreadB gets lock2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lock1) {
                System.out.println("ThreadB gets lock1");
            }
            System.out.println("ThreadB releases lock1");
        }
        System.out.println("ThreadB releases lock2");
    }
}

这里线程A获取了锁1,线程B获取了锁2。此时线程A需要获取锁2才能往下执行,线程B需要获取锁1才能往下执行。但线程A和线程B都不释放自己已经获取到的锁,都在等待对方释放锁,从而导致了死锁。执行这段代码会输出:

ThreadA gets lock1
ThreadB gets lock2

jconsole

ctrl+r,在命令行输入jconsole,弹出界面,选择对应的进程
图片1
图片2
图片3
可以看到已经发生了死锁。

jps+jstack

使用jps查看对应进程的id,这里得到id为3652
图片4
使用jstack -l 3652获取相关信息
图片5
可以发现已经出现了死锁。

猜你喜欢

转载自blog.csdn.net/YINLINNEVERG/article/details/85340489