本文版权归 远方的风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
可以发现该段程序死锁!