【多线程】死锁与Java栈跟踪工具
今天面试有一道题,写一个死锁的程序,自己也是短路了,没写出来,回来写下。
死锁常见的情况是A线程持有a锁、阻塞于b锁,B线程持有b锁,阻塞于a锁,形成一个循环阻塞的状态。
import java.util.concurrent.TimeUnit;
public class CyclicLock {
private static Object o1 = new Object();
private static Object o2 = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized(o1) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o2) {
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized(o2) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o1) {
}
}
}
}).start();
}
}
用了下Java栈跟踪工具jstack,可以生成当前虚拟机中的线程快照,此文件称为thread dump。(而用jmap -dump生成的是堆转储快照,heap dump)
这里居然还自动检测出死锁,略牛略牛。
C:\Users\Administrator>jps
11168 CyclicLock
3504
10204 Jps
C:\Users\Administrator>
C:\Users\Administrator>jstack -l 11168
2017-03-22 23:24:24
Full thread dump Java HotSpot(TM) Client VM (25.121-b13 mixed mode, sharing):
"DestroyJavaVM" #10 prio=5 os_prio=0 tid=0x001ac800 nid=0x20f0 waiting on condition [0
x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Thread-1" #9 prio=5 os_prio=0 tid=0x00a1f400 nid=0x2a28 waiting for monitor entry [0x
15f2f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at CyclicLock$2.run(CyclicLock.java:37)
- waiting to lock <0x044ab368> (a java.lang.Object)
- locked <0x044ab370> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
"Thread-0" #8 prio=5 os_prio=0 tid=0x00a1e400 nid=0x2bf0 waiting for monitor entry [0x
15bff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at CyclicLock$1.run(CyclicLock.java:20)
- waiting to lock <0x044ab370> (a java.lang.Object)
- locked <0x044ab368> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x009e6c00 nid=0x2698 runnable [0x0000
0000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x009dfc00 nid=0x2278 waiting on c
ondition [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x009de800 nid=0x27d8 waiting on cond
ition [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x009db400 nid=0x52c runnable [0x00
000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x009c0c00 nid=0x2214 in Object.wait() [0x1
56bf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x04408978> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
- locked <0x04408978> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
Locked ownable synchronizers:
- None
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00965000 nid=0x2624 in Object.wa
it() [0x155ff000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x04406a90> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Unknown Source)
at java.lang.ref.Reference.tryHandlePending(Unknown Source)
- locked <0x04406a90> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=2 tid=0x00960c00 nid=0x2874 runnable
"VM Periodic Task Thread" os_prio=2 tid=0x009e8000 nid=0x1664 waiting on condition
JNI global references: 6
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x009681c4 (object 0x044ab368, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00969b94 (object 0x044ab370, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at CyclicLock$2.run(CyclicLock.java:37)
- waiting to lock <0x044ab368> (a java.lang.Object)
- locked <0x044ab370> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
"Thread-0":
at CyclicLock$1.run(CyclicLock.java:20)
- waiting to lock <0x044ab370> (a java.lang.Object)
- locked <0x044ab368> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
Found 1 deadlock.
【多线程】死锁与Java栈跟踪工具的更多相关文章
- 使用jstack排查多线程死锁、阻塞
问题: 针对线上多线程死锁.阻塞,跑着跑着就卡住了 查看线上线程池的状态 jstack用于生成java虚拟机当前时刻的线程快照. 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...
- java命令--jstack 工具 查看JVM堆栈信息
介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项" ...
- java命令--jstack 工具
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- java命令--jstack 工具【转载】
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- JAVA 可视化分析工具 第12节
JAVA 可视化分析工具 第12节 经过前几章对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!那么这章我们就根据已有的理论知识,通过可视化工具来实践一番. 我们今天要讲 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- Java常用测试工具
第一部分:九款性能测试 Java入门 如果你才刚开始接触Java世界,那么要做的第一件事情是,安装JDK——Java Development Kit(Java开发工具包),它自带有Java Runti ...
- Java开发分析工具JProfiler的详细使用方法解析
JProfiler 11 是一款功能强大的Java代码分析工具,JProfiler的直观UI可帮助您解决性能瓶颈,确定内存泄漏并了解线程问题且JProfiler 11 Mac破解版配置会话非常简单,第 ...
- 一份详尽的 Java 问题排查工具清单,值得收藏!
| grep 5 -A 3 #上匹配seq 10 | grep 5 -B 3 #下匹配seq 10 | grep 5 -C 3 #上下匹配,平时用这个就妥了cat f.txt | g ...
随机推荐
- [转载]virtual box如何生成新的UUID
原文地址:virtual box如何生成新的UUID作者:阿昭 问题描述:在为Virtual Box加载多台虚拟机器(显然这些虚拟机器都来自一个模板)的时候,出现如下错误: "Cannot ...
- libev4.15学习
libev作为优秀的高性能IO框架,非常值得学习! 虽然我是菜鸟,但也必须学习啦,从今天一点一点地学习,慢慢进步! # include "ev.h" struct event_ba ...
- 【转】Kafka 之 中级
摘要: Kafka配置介绍,原理介绍及生产者,消费者Java基本使用方法. 1. 配置 Ø Broker主要配置 参数 默认值 说明(解释) broker.id =0 每一个broker在 ...
- 说说JSON和JSONP,也许你会豁然开朗,含jQuery使用jsonp用例
[原创]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了 ...
- Ceph BlueFS
一.概述 BlueFS是个小型文件系统,小体现在功能简单,没有实现Posix接口,不支持对文件的覆盖写操作只支持追加写,没有本地文件系统的树形层次结构,只有扁平的目录到文件的映射关系.和BlueSto ...
- 【java】switch case支持的6种数据类型
switch表达式后面的数据类型只能是byte,short,char,int四种整形类型,枚举类型和java.lang.String类型(从java 7才允许),不能是boolean类型. 在网上看到 ...
- centos yum源
#remi的源 rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm rpm --import /etc/pki/r ...
- 安卓sdk安装慢解决办法
1.上图SDK Manager 的 Tools ->Options打开SDK Manager的Settings, 选中“Force https://… sources to be fetched ...
- android studio 如何让包名展开
通常我们新建一个包名的时候,会发现他们连在一起,根本无法在创建一个同级的包 工具/原料 电脑,android studio 方法/步骤 1,我们先在包名下建一个包,变成了这样,根本无法在同 ...
- java中如何将byte[]里面的数据转换成16进制字符串
原文链接: http://zhidao.baidu.com/link?url=RmLDjr4PtP_oUE5J2pKNZSvlHt1K7HcCh4-03Y7VkXYhJ0kawg01CtKHZc2uB ...