Java多线程编程也是Java面试中经常考察的内容。刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁(deadlock)的应用出来。如何分析造成Java多线程的原因呢?很多时候我们在怀疑造成死锁的语句设置断点,单步调试,反而又不能重现了。这种现象很正常,因为咱们单步调试和直接运行程序,代码执行的时序是不同的,很可能无法满足死锁的触发条件。

实际上,JDK已经给Java程序员提供了强大的死锁分析工具,能够直接分析一个正在运行的并且处于死锁状态的应用,并给出具体是哪一行Java代码引起的死锁。

这篇文章就以一个例子来给大家演示如何使用这个JDK提供的标准工具。

这个工具叫jstack,就是JDK安装目录的bin文件夹下的一个执行文件。

我们首先写一个会导致死锁的应用出来。

public class DeadLockExample {public static void main(String[] args) {final String resource1 = "ABAP";final String resource2 = "Java";Thread t1 = new Thread() {public void run() {synchronized (resource1) {System.out.println("Thread 1: locked resource 1");try {Thread.sleep(100);}catch (Exception e) {}synchronized (resource2) {System.out.println("Thread 1: locked resource 2");}}}};Thread t2 = new Thread() {public void run() {synchronized (resource2) {System.out.println("Thread 2: locked resource 2");try {Thread.sleep(100);}catch (Exception e) {}synchronized (resource1) {System.out.println("Thread 2: locked resource 1");}}}};t1.start();t2.start();}
}

这个应用思路很简单,同时启动两个线程,分别锁住了resource1和resource2,然后休眠0.1秒,接着分别尝试去请求资源resource2和resource1。

执行应用,在控制台打印出下列输出后,进入死锁状态:

Thread 1: locked resource 1

Thread 2: locked resource 2

使用命令行 jps -l -m找到处于死锁状态应用的进程id。从下图得知死锁进程为51476:

然后使用命令行jstack 51476打印这个进程的运行栈信息。

我上图红色高亮出的 0x00000000d6f64988 和 0x00000000d6f649b8代表了代码中的两个资源“ABAP” 和“Java”。

jstack打印的输出非常清晰,显示了具体哪行Java代码试图去锁定哪一个Java资源(下图的waiting to lock)但是没有成功, 并且将失败的原因,即拥有当前请求资源的线程名称也打印了出来。

有了jstack,Java程序员不用对着冗长烧脑的多线程代码去冥思苦想了,JDK会自动把死锁原因打印出来,太方便了。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

使用JDK自带的工具jstack找出造成运行程序死锁的原因相关推荐

  1. 小工具:找出序列中的极值点

    小工具:找出序列中的极值点 逐渐痴迷于A股投机.最近研究A股大盘择时,发现研究时间序列周期性的时候,找序列中的极大极小值是一个很重要的工作(在很多信号处理算法多都需要做这一步).很多Python库包都 ...

  2. 用Windows自带的工具写一个一键关机小程序

    如何用Windows自带的工具写一个一键关机小程序 工具/原料(打勾勾的可用可不用) 装有Windows系统的电脑 在机子上装个格式工厂(版本随意,最好更新到最新的) 制作环境 windows自带命令 ...

  3. 在 Linux 上找出并解决程序错误的主要方法【转】

    在 Linux 上找出并解决程序错误的主要方法[转] 参考文章: (1)在 Linux 上找出并解决程序错误的主要方法[转] (2)https://www.cnblogs.com/sky-heaven ...

  4. 计算机上找不到运行程序怎么办,电脑运行程序打不开怎么解决

    电脑运行程序打不开怎么解决 导语:造成运行打不开的原因有用户设置出现了问题找不到运行程序,电脑被中毒.也有可能是硬件故障造成.这些都是有一定可能性.桌面运行程序打不开怎么解决?以下是小编收集的有关电脑 ...

  5. JDK自带JVM工具

    1 jdk 自带工具之jstat--虚拟机进程状况工具 使用方式 Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines& ...

  6. 【原创】字符串工具类--找出单元字符串

    package week01;import java.util.regex.Matcher; import java.util.regex.Pattern;/***** * 字符串帮助类* @auth ...

  7. 【JVM性能调优】使用jstack找出最耗CPU的java线程

    jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体的代码,所以它在JVM性能调优中很常见.下面我们在找出某个java进程中最耗CPU的线程,并定位堆栈信息,使用到的命令有:ps.top.p ...

  8. JVM调优之jstack找出最耗cpu的线程并定位代码

    jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有 ...

  9. 使用工具快速找出custom work center使用的ui component

    Created by Jerry Wang on Aug 03, 2014 已知UI上客户自己创建了一个work center "RTL test(使用business role TPM_P ...

最新文章

  1. 新浪微博封装类,以及常见问题sdk修改
  2. html应用多个类,html – 如何避免重复多个css类
  3. 响应格式html,设置响应格式的HTML邮件
  4. 使用 Maven 执行 java main class(java应用程序)
  5. 一篇文章教你学会使用SpringBoot实现文件上传和下载
  6. 博客主题正在修改....
  7. vlan划分不能上网_VLAN工作原理
  8. MySQL进阶(DDL与DML)
  9. react-native Android release打包失败
  10. 【02】查询优化的技术范围
  11. 使用PHPWord生成word文档
  12. Excel学习 -- 函数基础
  13. 工业相机与工业镜头相关参数详解
  14. 来看看小夏的链表讲解吧---从单链表到输入输出,查找元素,删除结点。---谨以此文祝朋友们生日快乐与官宣发糖。
  15. poi4.0升级踩坑合集(更新中)
  16. RedHat上安装openssl
  17. RangingTool 覆盖物文案国际化
  18. 计算机网络——网络层知识点
  19. JAVA高并发程序设计(葛一鸣著)读书笔记
  20. linux 找u盘,linux系统怎样找到U盘?

热门文章

  1. [ERROR] org.testng.TestNGException:Cannot find class in classpath:
  2. maven 配置(安装)以及遇到的The JAVA_HOME environment variable is not defined correctly.
  3. 数据分析面试必考的AB-Test知识点整理
  4. SAP Commerce Cloud SmartEdit 的安装
  5. SAP Spartacus Title 下拉菜单列表数据的读取逻辑
  6. 使用 SAP Business Application Studio 开发 Vue 应用
  7. 具有SmartFilterBar 的 SAP Fiori Elements 自动触发的搜索操作
  8. 试图安装客户出现SSR问题的Spartacus Storefront时遇到的错误消息
  9. 如何查找历史版本的SAP UI5 API文档
  10. SAP Authenticator apk下载