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

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

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

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

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

public classTest {public static voidmain(String[] args) {new Thread(newRunnable() {

@Overridepublic voidrun() {synchronized (B.class) {try{

Thread.sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}synchronized (A.class) {

}

}

}

}).start();new Thread(newRunnable() {

@Overridepublic voidrun() {synchronized (A.class) {try{

Thread.sleep(1000);

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}synchronized (B.class) {

}

}

}

}).start();

}

}classA {

}classB {

}

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

进入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 如何检测死锁_Java如何查看死锁相关推荐

  1. mysql死锁查询_Mysql 查看死锁,解除死锁 方式

    解除正在死锁的状态有两种方法: 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程.否则, ...

  2. java定时器检测状态_java 定时检测服务器端口状态方法(一)

    最近在写运维管理平台的定时检测集群中各台服务器端口开放状态来判断进程状态的定时任务.顺便整理了下java如何检测服务器一个或者多个端口,以及如何加到定时任务中. 一.java中用Socket检测服务器 ...

  3. plsql 查询存储过程死锁语句_SQL2005查看死锁存储过程sp_who_lock

    下面是我整理的监控sql server数据库,在性能测试过程中是否出现死锁.堵塞的SQL语句,还算比较准备,留下来备用. 调用方法:选中相应的数据库,执行exec sp_who_lock USE [m ...

  4. java gc检测工具_Java自带的性能监测工具之jstat

    本文使用jstat命令工具~ jstat简介 jstat (Java Virtual Machine Statistics Monitoring Tool) 是一个可以用于观察Java应用程序运行时信 ...

  5. java内存分析工具_java内存查看与分析

    业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...

  6. java性能检测工具_Java自带的性能监测工具之jmap

    本文继续介绍Java自带的性能监测工具,本文使用jmap工具来玩~ jmap (Java Memory Map) 命令可以生成Java应用程序的堆快照和对象统计信息,对生成的堆快照进行分析,可以分析堆 ...

  7. java中检测鼠标_java – 在屏幕上检测鼠标移动

    完全透明的框架不会接收鼠标事件. 这是使用MouseInfo的替代方法.这适用于应用程序的组件.是不可见的(透明的),未聚焦的或最小化的. import java.awt.*; import java ...

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

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

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

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

最新文章

  1. 如何团队协作,代码托管?Git使用教程:最详细、最浅显、一文读懂Git常用操作!...
  2. 验证RIP被动接口只收不发的正确性
  3. VS Code 调试Node.js express网站
  4. Go实战--也许最快的Go语言Web框架kataras/iris初识二(TOML、Cache、Cookie)
  5. 使用java+TestNG进行接口回归测试 1
  6. 使用 ServiceStack 构建跨平台 Web 服务(转)
  7. java教程-scala教程-带你从菜鸟入门
  8. java 委托原则_为什么说 Java SPI 的设计违反双亲委派原则
  9. 现代偏微分方程第1章预备知识复习题
  10. 2022年计算机408统考大纲,相比往年大量改动
  11. python的__name__
  12. ssis 包部署_如何使用各种选项从SSIS目录执行已部署的程序包
  13. INCEPTION 编译过程报错 make[2]: * [sql/CMakeFiles/sql.dir/sql_yacc.cc.o] Error
  14. Android实现计算器布局(线性布局)
  15. 一种抑制稳态振荡的改进型变步长MPPT 算法研究.pdf
  16. linux 安装p7zip 支持rar
  17. 浅谈撰写软文标题时需要规避的误区
  18. Python学习-小黑屋游戏
  19. 《哈利波特》最低折扣
  20. android小型app创意,创意无止境!17款让人脑洞大开的APP推荐

热门文章

  1. C#中要使一个类支持FOREACH遍历,实现过程怎样? [转]
  2. QTP简单框架(6)之脚本编写实例
  3. nginx.conf文件配置后访问边下载 以及yaf框架使用中NGINX.conf文件配置
  4. PHP-代码审计-文件上传
  5. [android] No resource found that matches the given name 'Theme.AppCompat.Light'
  6. LeetCode Algorithm 876. 链表的中间结点
  7. 2017/Province_Java_B/2、纸牌三角形
  8. Matrix工作室第六届纳新AI组考核题(B卷)
  9. 733. Flood Fill 图像渲染
  10. 【Qt】QModbusDeviceIdentification类