java死锁如何排查

本文探讨了Java中死锁的主要原因,包括系统资源不足、进程顺序不合适和资源分配不当,并通过一个模拟代码示例展示了死锁的发生。同时,介绍了如何使用jstack命令和jconsole工具进行死锁的排查,分析了死锁状态的日志输出。
摘要由CSDN通过智能技术生成

1、死锁主要原因

系统资源不足
进程运行推进的顺序不合适
资源分配不当

2、模拟死锁代码

package com.example.testdemo.juc;

public class DeadLockTest {

    public static void main(String[] args) {
        Object A = new Object();
        Object B = new Object();

        Thread threadA = new Thread(() -> {
            synchronized (A){
                System.out.println(Thread.currentThread().getName()+"持有A锁,希望获得B锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(B){
                    System.out.println(Thread.currentThread().getName()+"获取B锁成功");
                }
            }
        },"A");

        Thread threadB = new Thread(() -> {
            synchronized (B){
                System.out.println(Thread.currentThread().getName()+"持有B锁,希望获得A锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized(A){
                    System.out.println(Thread.currentThread().getName()+"获取A锁成功");
                }
            }
        },"B");

        threadA.start();
        threadB.start();
    }
}

运行结果:
在这里插入图片描述

可以看到程序运行的用户线程一直未结束,产生了死锁问题。

3、如何排查死锁

1)在jdk的bin目录下打开cmd窗口,输入jps -l
查看java进程情况和进程id
在这里插入图片描述
继续输入 jstack+进程号
在这里插入图片描述
在这里插入图片描述
可以看到最后的打印日志显示,A锁着 <0x000000072fd223c8>等待 <0x000000072fd223d8>,B则锁着 <0x000000072fd223d8>并等待 <0x000000072fd223c8>,互相持有互相等待,产生deadlock
2)在bin目录下打开jconsole.exe,在线程tab里面点击检索死锁按钮,可以看到相同的结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百里东君~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值