死锁排查的小窍门 --使用jdk自带管理工具jstack
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。
开发时间久了,难免会写出一些一些死锁的代码,自己明明调用该方法可该方法就是不执行、不进该方法、日志也不打印!
这里我们模拟一段死锁的代码,使用jdk自带的管理工具来排查是不是死锁了!
1 //死锁代码 2 public class DeadLockDemo implements Runnable{ 3 4 public int flag = 1; 5 //静态对象是类的所有对象共享的 6 private static Object o1 = new Object(), o2 = new Object(); 7 @Override 8 public void run() { 9 System.out.println("flag=" + flag); 10 if (flag == 1) { 11 synchronized (o1) { 12 try { 13 Thread.sleep(500); 14 15 } catch (Exception e) { 16 e.printStackTrace(); 17 } 18 synchronized (o2) { 19 System.out.println("1"); 20 } 21 } 22 } 23 if (flag == 0) { 24 synchronized (o2) { 25 try { 26 Thread.sleep(500); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 synchronized (o1) { 31 System.out.println("0"); 32 } 33 } 34 } 35 } 36 37 public static void main(String[] args) { 38 39 DeadLockDemo td1 = new DeadLockDemo(); 40 DeadLockDemo td2 = new DeadLockDemo(); 41 td1.flag = 1; 42 td2.flag = 0; 43 //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。 44 //td2的run()可能在td1的run()之前运行 45 new Thread(td1).start(); 46 new Thread(td2).start(); 47 48 } 49 }
启动该段代码,执行之后一直卡着
接下来我们在终端使用指令 jps查询该类的端口号为7824
再使用 jstack 端口号
jstack 7824
可以发现该段程序死锁!