例子程序:

  1. import java.util.concurrent.CountDownLatch;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. /**
  5. * Hello world!
  6. */
  7. public class App {
  8. public static void main(String[] args) throws InterruptedException {
  9. System.out.println("Hello World!");
  10. ExecutorService executorService = Executors.newFixedThreadPool(2);
  11. byte[] i = new byte[0];
  12. byte[] j = new byte[0];
  13. final CountDownLatch countDownLatch = new CountDownLatch(2);
  14. executorService.execute(new DeadThread1(i, j,countDownLatch));
  15. executorService.execute(new DeadThread2(i, j,countDownLatch));
  16. countDownLatch.await();
  17. System.out.println("done !!!");
  18. }
  19. public static class DeadThread1 implements Runnable {
  20. private byte[] i;
  21. private byte[] j;
  22. private CountDownLatch countDownLatch;
  23. public DeadThread1(byte[] i, byte[] j, CountDownLatch countDownLatch) {
  24. this.i = i;
  25. this.j = j;
  26. this.countDownLatch = countDownLatch;
  27. }
  28. @Override
  29. public void run() {
  30. synchronized (i) {
  31. try {
  32. Thread.sleep(1000);
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. }
  36. synchronized (j) {
  37. System.out.println(Thread.currentThread().getName() + "is running!!");
  38. countDownLatch.countDown();
  39. }
  40. }
  41. }
  42. }
  43. public static class DeadThread2 implements Runnable {
  44. private byte[] i;
  45. private byte[] j;
  46. private CountDownLatch countDownLatch;
  47. public DeadThread2(byte[] i, byte[] j, CountDownLatch countDownLatch) {
  48. this.i = i;
  49. this.j = j;
  50. this.countDownLatch = countDownLatch;
  51. }
  52. @Override
  53. public void run() {
  54. synchronized (j) {
  55. try {
  56. Thread.sleep(1000);
  57. } catch (InterruptedException e) {
  58. e.printStackTrace();
  59. }
  60. synchronized (i) {
  61. System.out.println(Thread.currentThread().getName() + "is running!!");
  62. countDownLatch.countDown();
  63. }
  64. }
  65. }
  66. }
  67. }

通过jps找到当前进程号:

  1. guohaozhao116008@GUOHAOZHAO11600 /d
  2. $ jps
  3. 7448 RemoteMavenServer
  4. 6600 JConsole
  5. 6340 Jps
  6. 6272
  7. 7268 AppMain

通过jstack查看堆栈信息:

  1. guohaozhao116008@GUOHAOZHAO11600 /d
  2. $ jstack
  3. Usage:
  4. jstack [-l] <pid>
  5. (to connect to running process)
  6. jstack -F [-m] [-l] <pid>
  7. (to connect to a hung process)
  8. jstack [-m] [-l] <executable> <core>
  9. (to connect to a core file)
  10. jstack [-m] [-l] [server_id@]<remote server IP or hostname>
  11. (to connect to a remote debug server)
  12. Options:
  13. -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
  14. -m  to print both java and native frames (mixed mode)
  15. -l  long listing. Prints additional information about locks
  16. -h or -help to print this help message
  17. guohaozhao116008@GUOHAOZHAO11600 /d
  18. $ jps
  19. 7448 RemoteMavenServer
  20. 6600 JConsole
  21. 6340 Jps
  22. 6272
  23. 7268 AppMain
  24. guohaozhao116008@GUOHAOZHAO11600 /d
  25. $ jstack -l 7268
  26. 2013-05-30 18:36:41
  27. Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.14-b01 mixed mode):
  28. Found one Java-level deadlock:
  29. =============================
  30. "pool-1-thread-2":
  31. waiting to lock monitor 0x000000000677c208 (object 0x00000000eafc3e18, a [B),
  32. which is held by "pool-1-thread-1"
  33. "pool-1-thread-1":
  34. waiting to lock monitor 0x0000000006771be8 (object 0x00000000eafc3e28, a [B),
  35. which is held by "pool-1-thread-2"
  36. Java stack information for the threads listed above:
  37. ===================================================
  38. "pool-1-thread-2":
  39. at com.sohu.suc.App$DeadThread2.run(App.java:74)
  40. - waiting to lock <0x00000000eafc3e18> (a [B)
  41. - locked <0x00000000eafc3e28> (a [B)
  42. at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
  43. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
  44. at java.lang.Thread.run(Thread.java:662)
  45. "pool-1-thread-1":
  46. at com.sohu.suc.App$DeadThread1.run(App.java:45)
  47. - waiting to lock <0x00000000eafc3e28> (a [B)
  48. - locked <0x00000000eafc3e18> (a [B)
  49. at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
  50. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
  51. at java.lang.Thread.run(Thread.java:662)
  52. Found 1 deadlock.

可以看到:

这里发生了死锁。

使用图形工具 jconsole 同样可以检测到:

java 线程死锁的检测的更多相关文章

  1. Java线程死锁查看分析方法

    如何查看是否有Java线程死锁?下面介绍两种方法. 一.Jconsole        Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输 ...

  2. Java——线程死锁问题

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  3. 55行代码实现Java线程死锁

    死锁是Java多线程的重要概念之一,也经常出现在各大公司的笔试面试之中.那么如何创造出一个简单的死锁情况?请看代码: class Test implements Runnable { boolean ...

  4. 一个Java线程死锁的例子

    package com.lk.B; public class Test4 { private static final Object o1 = new Object(); private static ...

  5. 【!Important】Java线程死锁查看分析方法

    一.Jconsole Jconsole是JDK自带的图形化界面工具,使用JDK给我们提过的工具JConsole,可以通过cmd打开命令框然后输入Jconsole打开图形工具 然后点击检测死锁就可以查看 ...

  6. JAVA线程死锁

    文件名:DeadThreadByExtend.java 注: 1.起线程的时候用的是start方法,run方法也可以调用,但是仅仅相当于普通调用,在当前线程内执行. 2.synchronized 不能 ...

  7. 诊断Java线程死锁

    比如我们有运行这样一个程序: 了解多线程的小伙版都知道,这段代码不会有打印结果,因为发生了死锁.我们在服务器上运行试试,没有输出,对应的进程是 32752. 使用 “jstack 32752”排查,后 ...

  8. Java 多线程 死锁 隐性死锁 数据竞争 恶性数据竞争 错误解决深入分析 全方向举例

    在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些特殊的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同.因此,在编写多线程程序时,事先认 ...

  9. Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.

    Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript. 1. 现象::主程序卡住无反应,多行任务不往下执行 1 2. 原因::使用j ...

随机推荐

  1. MyEclipse配置https

    1.参照CAS配置(1)SSL证书配置文章配置证书. 2.打开myeclipse的Workspace下的.metadata/.me_tcat7/conf/server.xml 打开文件,添加如下代码 ...

  2. ACM_来自不给标题的菜鸟出题组(巴什博弈+素数判定)

    来自不给标题的菜鸟出题组 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大B和小b合作出一道程序设计月赛的题,他们的想法是给定一 ...

  3. xcode制作越狱后ipa安装文件

    正常情况下发布测试版给用户需要问到对方设备ID并添加到开发者证书里去感觉有点麻烦,如果是已越狱过的机器可以使用xcode制作ipa文件,并直接用itunes同步进去,这样方便多了. 将运行目标选为iO ...

  4. android开源新闻小程序、3D翻转公告效果、小说检索、Kotlin开发TODO清单等源码

    Android精选源码 开源新闻小程序源码分享 android动态壁纸.锁屏动画.来电秀等源码 android笔记App效果源码 Android实现3D版翻页公告效果 android小说搜索阅读源码 ...

  5. springboot + sharding-jdbc 学习

    官网地址:http://shardingsphere.io/document/current/cn/overview/ sharding-jdbc事务:https://blog.csdn.net/ya ...

  6. Android TV 选中高亮显示

    1.开发Android TV APP, 使用遥控器选中按钮或者选着其它菜单 如果没有高亮显示,就看不出选中哪个按钮或者菜单 2.在drawable 添加 border_red.xml 设置选中高亮 & ...

  7. C# Socket发送接收字节数组和十六16进制之间转换函数

    近期在使用远程网络模块的时候, 需要用的Socket发送数据,远程模块指令为16进制. 官方提供的DEMO比较繁琐.不方便新手使用. 下面的转换函数可大大方便新手使用. // 16进制字符串转字节数组 ...

  8. php实现非对称加密

    <?php /** * 使用openssl实现非对称加密 * * @since 2015-11-10 */ class Rsa { /** * 私钥 * */ private $_privKey ...

  9. Morse理论:拓扑不变性特征匹配原理

    设计精美的宽基线双目相机镇文 Mo'ersi lilun莫尔斯理论(卷名:数学) Morse theory 微分拓扑的一个重要分支.通常是指两部分内容:一部分是微分流形上可微函数的莫尔斯理论,即临界点 ...

  10. [CefSharp] 如何在JavaScript中调用C#代码

    本例在WinForms下实现,具体流程与WPF一致. 本例仅供调用示例,不代表正常业务书写流程. 1. 创建WinForms项目,并将项目属性设置为x86平台 此处预先设置,避免引用时报错,再花更多的 ...