今天面试有一道题,写一个死锁的程序,自己也是短路了,没写出来,回来写下。

死锁常见的情况是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栈跟踪工具的更多相关文章

  1. 使用jstack排查多线程死锁、阻塞

    问题: 针对线上多线程死锁.阻塞,跑着跑着就卡住了 查看线上线程池的状态 jstack用于生成java虚拟机当前时刻的线程快照. 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...

  2. java命令--jstack 工具 查看JVM堆栈信息

    介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项" ...

  3. java命令--jstack 工具

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  4. java命令--jstack 工具【转载】

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  5. JAVA 可视化分析工具 第12节

    JAVA 可视化分析工具  第12节 经过前几章对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!那么这章我们就根据已有的理论知识,通过可视化工具来实践一番. 我们今天要讲 ...

  6. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  7. Java常用测试工具

    第一部分:九款性能测试 Java入门 如果你才刚开始接触Java世界,那么要做的第一件事情是,安装JDK——Java Development Kit(Java开发工具包),它自带有Java Runti ...

  8. Java开发分析工具JProfiler的详细使用方法解析

    JProfiler 11 是一款功能强大的Java代码分析工具,JProfiler的直观UI可帮助您解决性能瓶颈,确定内存泄漏并了解线程问题且JProfiler 11 Mac破解版配置会话非常简单,第 ...

  9. 一份详尽的 Java 问题排查工具清单,值得收藏!

    | grep 5 -A 3    #上匹配seq 10 | grep 5 -B 3    #下匹配seq 10 | grep 5 -C 3    #上下匹配,平时用这个就妥了cat f.txt | g ...

随机推荐

  1. 分享一个VS2008漂亮的黑色主题

    如果恰巧你也使用Visual Studio 2008这个版本, 如果你也恰巧厌烦了白色的背景, 那么推荐你使用这款纯黑色theme,搭配上DroidSansMonog这个等宽字体(打包下载),每天都可 ...

  2. 五年屌丝运维工作shell精华

    屌丝运维常用shell列出你最常用的10条shellhistory | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | so ...

  3. Redis学习之路(008)- Redis C语言客户端库hiredis文档翻译

    Hiredis是Redis数据库一个轻量的C语言客户端库. 之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能.但正是由于这种设计使我们只要熟悉了通用的r ...

  4. hadoop遇到的问题及处理

    1:杀掉hadoop作业 列出作业 ./hadoop job -list 杀掉 ./hadoop job -kill job_id 1:某些节点出现running asprocess XXX. Sto ...

  5. numpy 基于数值范围创建ndarray()

    基于数值范围创建函数创建ndarray 1 numpy.arange arange([start=0,] stop[, step=1,][, dtype=None]) >>> np. ...

  6. android开发资源

    android仿微信 http://www.oschina.net/code/snippet_253900_33261

  7. [AaronYang] 敏捷开发 教程目录

                   AaronYang 敏捷开发  自己自学 原创分享教程                       http://AaronYang.cnblogs.com   文章处理 ...

  8. Oracle 12C -- ADR结构

    ADR路径由参数diagnostic_dest参数决定: SQL> show parameter diagnostic_dest NAME TYPE VALUE ---------------- ...

  9. Oracle 12C -- 扩展varchar2、nvarchar2、和raw数据类型的大小限制

    在12C中,varchar2,nvarchar2和raw类型从之前的4K扩展到32K 升级到12C后,参数max_string_size默认值是standard,即不改变varchar2.nvarch ...

  10. C++ STL vector(向量容器)的使用(附完整程序代码)

    一.简单介绍 Vectors 包括着一系列连续存储的元素,其行为和数组类似. 訪问Vector中的随意元素或从末尾加入元素都能够在O(1)内完毕,而查找特定值的元素所处的位置或是在Vector中插入元 ...