【Java并发】如何进行死锁诊断?

1.什么是死锁

死锁(Deadlock)是指两个或多个进程(线程)在执行过程中,由于竞争资源而陷入无限等待的状态,导致它们都无法继续执行下去。简单来说,就是一种互相等待对方释放资源的情况,从而造成所有参与者都无法继续执行的僵局。

2.死锁怎么产生的

产生的四个必要条件如下:(缺一不可)

  1. 互斥条件:一个资源同一时间能且只能被一个线程访问;
  2. 不可掠夺:当资源被一个线程占用时,其他线程不可抢夺该资源;
  3. 请求与等待:当资源被一个线程占用时,其他线程只能等待资源的释放再拥有;
  4. 循环等待:指的是若干线程形成头尾相接的情况,将所有资源都占用导致的整体死锁或局部死锁。

一个线程需要同时获取多把锁,这时就容易发生死锁

前三条其实就是作为锁的条件,第四条(循环等待)就是造成死锁的主要原因

循环等待也就是双方的锁都锁住了对方,并且都在等待对方的解锁,造成死循环(类似springbean的循环依赖)
在这里插入图片描述

3.如何进行死锁诊断?

示例代码:
线程t1和线程t2造成资源争抢,造成死锁
在这里插入图片描述

3.1 通过命令查看

第一:通过jps命令查看运行的线程
在这里插入图片描述
第二,使用jstack查看线程运行的情况,下图是截图的关键信息
运行命令:jstack -l 46032
在这里插入图片描述

3.2 jconsole可视化工具

用于对jvm的内存,线程,类 的监控,是一个基于 jmx 的 GUI 性能监控工具
打开方式:java 安装目录 bin目录下 直接启动 jconsole.exe 就行

  • 选择进程

在这里插入图片描述

  • 点击线程:可查看到死锁的线程,死锁出现在代码哪一行
    在这里插入图片描述

3.2 VisualVM:故障处理工具

能够监控线程内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈
打开方式:java 安装目录 bin目录下 直接启动 jvisualvm.exe就行
在这里插入图片描述
在这里插入图片描述
参考来自黑马程序员

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值