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

    可以发现该段程序死锁!

  • 相关阅读:
    selenium2截图ScreenShot的使用
    selenium2断言类Assert的使用
    selenium2中的TestNg注解和数据驱动的简介及使用
    bash函数定义/使用/传参…
    bash字符串操作
    bash数组操作-定义/初始化/赋值…
    bash实例-参数/函数/统计IP
    01.AutoMapper 之约定(Conventions)
    00.AutoMapper 之入门指南(Getting Started Guide)
    AutoMapper
  • 原文地址:https://www.cnblogs.com/lyhc/p/7078160.html
Copyright © 2020-2023  润新知