转载自 https://blog.csdn.net/u014039577/article/details/52351626

Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难。

因为涉及到java多线程的时候,有的问题会特别复杂,而且就算我们知道问题出现是因为死锁了,我们也很难弄清楚为什么发生死锁,那么当我们遇到了死锁问题,我们应该如何来检测和查看死锁呢?

Java中jdk 给我们提供了很便利的工具,帮助我们定位和分析死锁问题:

1、死锁产生原因:当两个或者多个线程互相持有一定资源,并互相等待其他线程释放资源而形成的一种僵局,就是死锁。

2、构建一个死锁的场景:

public class Test {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {synchronized (B.class) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (A.class) {}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {synchronized (A.class) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (B.class) {}}}}).start();}}
class A {}class B {}

可以看到运行时,一个线程持有A资源,希望使用B资源,而另一个线程持有B资源,希望使用A 资源,然后就陷入了相互等待的僵局,这样就形成了死锁。

3、Jconsole查看死锁

进入java安装的位置,输入Jconsole,然后弹出界面(或者进入安装目录/java/jdk1.70_80/bin/,点击Jconsole.exe):

然后点击进入:

然后点击检测死锁:

然后可以看到造成死锁的两个线程,以及死锁原因:

Thread-0:持有java.lang.Class@1694ce18,需要java.lang.Class@1feb0edd,但是java.lang.Class@1feb0edd却被Thread-1持有,然后陷入等待。

Thread-1:持有java.lang.Class@1feb0edd,需要java.lang.Class@1694ce18,但是java.lang.Class@1694ce18却被Thread-0持有,然后陷入等待。

4、Jstack查看死锁:

同样,也是进入jdk安装目录的bin下面,输入jps,先查看我们要检测死锁的进程:

然后可以看到进程Test的进程号:8384,然后执行:Jstack -l 8384

查看死锁信息:

Java如何查看死锁?相关推荐

  1. lua mysql 死锁_使用 mysqladmin debug 查看死锁信息

    使用 mysqladmin debug 查看死锁信息 mysqladmin -S /mysql/data/mysql.sock debug 然后在error日志中,会看到: 11 lock struc ...

  2. java 如何检测死锁_Java如何查看死锁

    Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难. 因为涉及到java多线程的时候,有的问题会特别复杂,而 ...

  3. Java多线程之死锁编码及定位分析

    Java多线程之死锁编码及定位分析 目录 死锁是什么 代码实现 死锁解决办法 1. 死锁是什么 死锁是指两个或两个以上的进程在执行过程中因争夺资而造成的一种互相等待的现象,若无外力干涉那它们都将无法推 ...

  4. java中线程死锁及避免_如何避免Java线程中的死锁?

    java中线程死锁及避免 如何避免Java中的死锁? 是Java面试中最受欢迎的问题之一,也是本季多线程的风格,主要是在高层提出,并带有很多后续问题. 尽管问题看起来很基础,但是一旦您开始深入研究,大 ...

  5. java 解决死锁_如何解决java中的死锁问题

    一.死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去. 那么我们换一个更加规范的定义:集合中的每一个进程都在 ...

  6. Java中的死锁及其解决方案

    Java中的死锁及其解决方案 在Java中,锁是很常见的一个工具,常见的用法就是在高并发场景下保证线程安全,但是使用不当也会造成死锁,给我们带来一些不必要的麻烦,本文分析死锁及其产生原因,并作出相应的 ...

  7. 锁与并发工具包与线程池与LockSupport与Fork/Join框架与并行流串行流与阻塞队列与JPS,jstack命令查看死锁查看线程状态与AQS个人笔记九

    朝闻道,夕死可矣 本文共计 86564字,估计阅读时长1小时 点击进入->Thread源码万字逐行解析 文章目录 本文共计 86564字,估计阅读时长1小时 一锁 二Java中13个原子操作类 ...

  8. java产生死锁的主要原因_详解java中产生死锁的原因及如何避免

    1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2 ...

  9. mysql查看死锁并杀掉_查看当前进程,或死锁进程,并能自动杀掉死进程_MySQL

    /*--处理死锁 查看当前进程,或死锁进程,并能自动杀掉死进程 因为是针对死的,所以如果有死锁进程,只能查看死锁进程 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程 --邹建 2004.4 ...

最新文章

  1. MATLAB常用函数, 常见问题
  2. 实验一:JDK下载与安装、Eclipse下载与使用总结心得
  3. Python3编程语言之enumerate() 函数使用示例
  4. Linux安装Redis服务
  5. Matlab神经网络十讲(7): Adaptive Filter and Adaptive Training
  6. 启明云端分享|PX30核心板 怎么烧录
  7. Ubuntu安装qwt步骤
  8. 【计蒜客 - 2019南昌邀请赛网络赛 - M】Subsequence(字典树,dp预处理)
  9. 计算机管理可以更新吗,微信可以批量管理好友吗(电脑版微信3.0.0更新规则了)...
  10. wos 文献被引_全世界最权威的文献检索工具,这6个检索技巧必须要掌握!
  11. Python_day01-----day07
  12. virtuoso 安装与使用
  13. Mbed OS STM32F429 中断方式接收 ADS1256
  14. 【板栗糖GIS】DOS—如何在目录文件中批量建立子文件夹
  15. CentOS7.6 无网络环境安装MySQL5.7.x
  16. hadoop的小疑问:Map执行未结束便开始执行Reduce操作?
  17. 战略到底在研究什么?
  18. PW4203降压型1-3节锂电池充电芯片
  19. 你的气质里藏着 英文_你的气质里,藏着你走过的路,读过的书,见过的人,看过的风景……...
  20. [深入研究]什么是G3D几何交换格式?

热门文章

  1. 内核隐藏进程(源码)
  2. ADO学习(八)源码示例
  3. 事件过滤器及不规则窗体
  4. Easy Tech:什么是I帧、P帧和B帧?
  5. 【直播预告 | 今天10:30】多媒体技术PI第三期:网络传输
  6. LiveVideoStack线上分享第五季(八):播放器的极致体验优化
  7. MSU公布2019视频压缩评比报告客观部分
  8. LiveVideoStackCon讲师热身分享 ( 五 ) —— 建立中国自主视频技术生态
  9. 假期不能错过的音视频领域技术进展
  10. 腾讯开源 TurboTransformers:自然语言处理推理加速工具