死锁排查的小窍门 --使用jdk自带管理工具jstack
2021-07-13 17:04
标签:使用 images class span 声明 sync jps out 链接 本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。 开发时间久了,难免会写出一些一些死锁的代码,自己明明调用该方法可该方法就是不执行、不进该方法、日志也不打印! 这里我们模拟一段死锁的代码,使用jdk自带的管理工具来排查是不是死锁了! 启动该段代码,执行之后一直卡着 接下来我们在终端使用指令 jps查询该类的端口号为7824 再使用 jstack 端口号 可以发现该段程序死锁! 死锁排查的小窍门 --使用jdk自带管理工具jstack 标签:使用 images class span 声明 sync jps out 链接 原文地址:http://www.cnblogs.com/lyhc/p/7078160.html 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 }
jstack 7824
下一篇:什么是css动画
文章标题:死锁排查的小窍门 --使用jdk自带管理工具jstack
文章链接:http://soscw.com/index.php/essay/104716.html