死锁排查的小窍门 --使用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

可以发现该段程序死锁!

posted @ 2017-06-25 21:58  远方的风lyh  阅读(1098)  评论(2编辑  收藏  举报