一起来看看,如何使用 jstack 分析死锁?

↑↑↑ 欢迎 点赞、关注、收藏!!!,10 年 IT 行业老鸟,持续分享更多 IT 干货

目录

如何使用 jstack 分析死锁

准备

使用 jstack


如何使用 jstack 分析死锁

参考:https://www.yuque.com/hollis666/go2k1v/ql40gqum24bg3bdk


准备

一段死锁程序

 package javaCommand;
 ​
 public class JStackDemo {
     public static void main(String[] args) {
         Thread t1 = new Thread(new DeadLockclass(true));//建立一个线程
         Thread t2 = new Thread(new DeadLockclass(false));//建立另一个线程
         t1.start();//启动一个线程
         t2.start();//启动另一个线程
     }
 }
 class DeadLockclass implements Runnable {
     public boolean falg;// 控制线程
     DeadLockclass(boolean falg) {
         this.falg = falg;
     }
     public void run() {
         /**
          * 如果falg的值为true则调用t1线程
          */
         if (falg) {
             while (true) {
                 synchronized (Suo.o1) {
                     System.out.println("o1 " + Thread.currentThread().getName());
                     synchronized (Suo.o2) {
                         System.out.println("o2 " + Thread.currentThread().getName());
                     }
                 }
             }
         }
         /**
          * 如果falg的值为false则调用t2线程
          */
         else {
             while (true) {
                 synchronized (Suo.o2) {
                     System.out.println("o2 " + Thread.currentThread().getName());
                     synchronized (Suo.o1) {
                         System.out.println("o1 " + Thread.currentThread().getName());
                     }
                 }
             }
         }
     }
 }
 ​
 class Suo {
     static Object o1 = new Object();
     static Object o2 = new Object();
 }

执行一下,两个线程都阻塞等待了。

image-20250515203927223


使用 jstack

接下来,我们使用jstack来看一下线程堆栈信息:

image-20250515204146281

分析

 Thread-1 在想要执行第40行的时候,当前锁住了资源<0x00000007d6aa2ca8>,但 是他在等待资源<0x00000007d6aa2c98> 
 Thread-0 在想要执行第27行的时候,当前锁住了资源<0x00000007d6aa2c98>,但是他在等待资源<0x00000007d6aa2ca8> 
 这两个线程都持有资源,并且都等待对方的资源,所以造成了死锁。
 原因我们找到了,就可以具体问题,具体分析,解决这个死锁了。

↑↑↑ 欢迎 点赞、关注、收藏!!!,10 年 IT 行业老鸟,持续分享更多 IT 干货

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写文章的大米

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值