博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java如何查看死锁?
阅读量:6586 次
发布时间:2019-06-24

本文共 1385 字,大约阅读时间需要 4 分钟。

转载自 

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

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

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

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

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

  1.  
    public class Test {
  2.  
     
  3.  
    public static void main(String[] args) {
  4.  
    new Thread(new Runnable() {
  5.  
     
  6.  
    @Override
  7.  
    public void run() {
  8.  
    synchronized (B.class) {
  9.  
    try {
  10.  
    Thread.sleep(
    1000);
  11.  
    }
    catch (InterruptedException e) {
  12.  
    e.printStackTrace();
  13.  
    }
  14.  
    synchronized (A.class) {
  15.  
     
  16.  
    }
  17.  
    }
  18.  
    }
  19.  
    }).start();
  20.  
    new Thread(new Runnable() {
  21.  
     
  22.  
    @Override
  23.  
    public void run() {
  24.  
    synchronized (A.class) {
  25.  
    try {
  26.  
    Thread.sleep(
    1000);
  27.  
    }
    catch (InterruptedException e) {
  28.  
    // TODO Auto-generated catch block
  29.  
    e.printStackTrace();
  30.  
    }
  31.  
    synchronized (B.class) {
  32.  
     
  33.  
    }
  34.  
    }
  35.  
     
  36.  
    }
  37.  
    }).start();
  38.  
    }
  39.  
     
  40.  
    }
  41.  
    class A {
  42.  
     
  43.  
    }
  44.  
     
  45.  
    class B {
  46.  
     
  47.  
    }

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

 

3、查看死锁

进入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

查看死锁信息:

转载于:https://www.cnblogs.com/bootdo/p/10481771.html

你可能感兴趣的文章
关于vue项目本地运行以后,输入本机ip不能访问的问题
查看>>
idea找不到或无法加载主类
查看>>
我人生中的第一场Java面试
查看>>
redux速成法典
查看>>
java灵活传参之builder模式
查看>>
上集: Android开源库大全分类汇总(Android技术资料汇总)
查看>>
iOS面试知识点(一)
查看>>
交易所相继上线BCH合约,意味着什么?
查看>>
阿里云爬虫风险管理产品商业化,为云端流量保驾护航
查看>>
Centos 6更新yum安装源
查看>>
mysql数据库字符集问题
查看>>
我的友情链接
查看>>
数学之美笔记(十二)
查看>>
nginx 逻辑运算
查看>>
为MySQL选择合适的备份方式
查看>>
sersync文件实时同步
查看>>
ExcelWithOdbc控件的使用
查看>>
HashMap
查看>>
我的友情链接
查看>>
linux基础介绍3-24
查看>>