java死锁如何排查

Posted 百里东君~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java死锁如何排查相关的知识,希望对你有一定的参考价值。

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里面点击检索死锁按钮,可以看到相同的结果

以上是关于java死锁如何排查的主要内容,如果未能解决你的问题,请参考以下文章

java死锁如何排查

「操作系统」深入理解死锁(什么是死锁?死锁形成条件?如何避免死锁?如何排查死锁?)

JAVA死锁排查-性能测试问题排查思路

Java死锁排查和Java CPU 100% 排查的步骤整理

Java死锁排查和Java CPU 100% 排查的步骤整理(转)

java多线程死锁及死锁问题排查