java死锁检测
执行下面代码
public class DeadLock {public static String obj1 = "obj1";public static String obj2 = "obj2";public static void main(String[] args){Thread a = new Thread(new Lock1());Thread b = new Thread(new Lock2());a.start();b.start();}
}public class Lock1 implements Runnable{@Overridepublic void run(){try{System.out.println("Lock1 running");while(true){synchronized(DeadLock.obj1){System.out.println("Lock1 lock obj1");Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2synchronized(DeadLock.obj2){System.out.println("Lock1 lock obj2");}}}}catch(Exception e){e.printStackTrace();}}
}public class Lock2 implements Runnable{@Overridepublic void run(){try{System.out.println("Lock2 running");while(true){synchronized(DeadLock.obj2){System.out.println("Lock2 lock obj2");Thread.sleep(3000);synchronized(DeadLock.obj1){System.out.println("Lock2 lock obj1");}}}}catch(Exception e){e.printStackTrace();}}
}
打开命令行,执行jvisualvm命令
jvisualvm界面显示检测出死锁信息
执行线程dump
从上面的日志信息可以看到,两个线程分别在等待获取锁,而且可以发现线程执行代码行数。
以上是通过可视化界面检测死锁,下面通过命令行来排查死锁
分别执行jps 和 jstack命令
这里通过jps找到2453的进程号
通过线程堆栈信息,可检测到死锁信息。