1、制造死锁场景
一段死锁程序
public class DeadLock {public static Object lockA = new Object();public static Object lockB = new Object();public static void main(String[] args) {new ThreadA().start();new ThreadB().start();}
}class ThreadA extends Thread {@Overridepublic void run() {synchronized(DeadLock.lockA) {System.out.println(Thread.currentThread().getName() + " get LockA");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized(DeadLock.lockB) {System.out.println(Thread.currentThread().getName() + " get LockB");}}}
}class ThreadB extends Thread {@Overridepublic void run() {synchronized(DeadLock.lockB) {System.out.println(Thread.currentThread().getName() + " get LockB");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized(DeadLock.lockA) {System.out.println(Thread.currentThread().getName() + " get LockA");}}}
}
运行该程序会出现死锁:
2、分析死锁
2.1 使用Thread Dump
使用JDK提供的一个非常强大的性能诊断工具:Thread Dump来解决。
2.1 在Linux系统上通过执行kill -3 PID来获取某个java进程的Thread Dump信息。
2.2 使用JDK自带的工具:jps 来获取执行中的java进程的PID。(或者ps -ef|grep java)
2.3 新开一个命令行窗口,执行jps获取运行中的java进程的PID。
或者使用这种方式获取进程ID,传送门
然后执行:
./jstack pid > thread.txt
打开生成的thread dump文件,发现如下信息:
bingo!找到了死锁信息,并定位到了代码位置
2.1 使用JConsole
Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。
1.连接到需要查看的进程
打开线程选项卡,然后点击左下角的“检测死锁” 。
发现死锁信息