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 CPU 100% 排查的步骤整理