Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,下面介绍两种排查死锁的方法

1、构建一个死锁的场景:

package com.weichao.exercise.concurrency;

public class DeadLockDemo {
    
    private static String A = "A";
    
    private static String B = "B";

    public static void main(String[] args) {
        new DeadLockDemo().deadLock();
    }

    private void deadLock() {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (A){
                    try{
                        Thread.sleep(2000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    synchronized (B){
                        System.out.println("1");
                    }
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (B){
                    synchronized (A){
                        System.out.println("2");
                    }
                }
            }
        });
        t1.start();
        t2.start();
    }
}

可以看到运行时,一个线程持有A资源,希望使用B资源,而另一个线程持有B资源,希望使用A 资源,然后就陷入了相互等待的僵局,这样就形成了死锁。
3、Jconsole查看死锁

进入java安装的位置,输入Jconsole,然后弹出界面(或者进入安装目录/java/jdk1.70_80/bin/,点击Jconsole.exe):

然后点击进入:

然后点击检测死锁:

然后可以看到造成死锁的两个线程,以及死锁原因:

Thread-0:持有[email protected],需要[email protected],但是[email protected]却被Thread-1持有,然后陷入等待。

Thread-1:持有[email protected],需要[email protected],但是[email protected]却被Thread-0持有,然后陷入等待。

Jvm排查死锁

4、Jstack查看死锁:

同样,也是进入jdk安装目录的bin下面,输入jps,先查看我们要检测死锁的进程:

然后可以看到进程Test的进程号:8384,然后执行:Jstack -l 8384

查看死锁信息:
Jvm排查死锁

相关文章: