之前已经学习了关于同步锁的知识,但是在实际编写多线程程序时可能会存在死锁的情况,所以这次来模拟一下死锁,并且学会用一个命令来确认是否程序已经出现死锁了,下面开始:

首先新建两个类:

此时当然得到OtherService类中增加这个s1()方法喽,如下:

目前是DeadLock调用了OtherService的方法,这时反过了,让OtherService去调用DeadLock类的方法,所以代码如下:

所以此时在DeadLock中新建一个m2()方法,如下:

此时编写测试代码来测试一下,首先构造相关依赖的关系,如下:

接下来新建两个线程然后发起方法调用,具体如下:

接下来编译运行:

执行了一段之后程序卡住了,而且进程一直没有结束,其实这就是典型死锁原因造成,用什么方式来以查看到这个死锁的状态呢?其实可以通过一个命令行可以查询,具体如下:

先用"jps"命令查看当前程序的进程号,如下:

然后用"jstack"命令查看该进程的线程情况,如下:

  1. xiongweideMacBook-Pro:wechat_jump_game xiongwei$ jstack 99374
  2. 2018-02-04 15:13:00
  3. Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode):
  4.  
  5. "Attach Listener" #12 daemon prio=9 os_prio=31 tid=0x00007fe88404b000 nid=0x1107 waiting on condition [0x0000000000000000]
  6. java.lang.Thread.State: RUNNABLE
  7.  
  8. "DestroyJavaVM" #11 prio=5 os_prio=31 tid=0x00007fe88380e000 nid=0x1a03 waiting on condition [0x0000000000000000]
  9. java.lang.Thread.State: RUNNABLE
  10.  
  11. "Thread-1" #10 prio=5 os_prio=31 tid=0x00007fe883087000 nid=0x4d03 waiting for monitor entry [0x00007000061e1000]
  12. java.lang.Thread.State: BLOCKED (on object monitor)
  13. at com.javaconcurrency.synchronized4.DeadLock.m2(DeadLock.java:20)
  14. - waiting to lock <0x0000000795780bb0> (a java.lang.Object)
  15. at com.javaconcurrency.synchronized4.OtherService.s2(OtherService.java:21)
  16. - locked <0x000000079577c6d8> (a java.lang.Object)
  17. at com.javaconcurrency.synchronized4.DeadLockTest$2.run(DeadLockTest.java:22)
  18.  
  19. "Thread-0" #9 prio=5 os_prio=31 tid=0x00007fe88381a000 nid=0x4b03 waiting for monitor entry [0x00007000060de000]
  20. java.lang.Thread.State: BLOCKED (on object monitor)
  21. at com.javaconcurrency.synchronized4.OtherService.s1(OtherService.java:14)
  22. - waiting to lock <0x000000079577c6d8> (a java.lang.Object)
  23. at com.javaconcurrency.synchronized4.DeadLock.m1(DeadLock.java:14)
  24. - locked <0x0000000795780bb0> (a java.lang.Object)
  25. at com.javaconcurrency.synchronized4.DeadLockTest$1.run(DeadLockTest.java:13)
  26.  
  27. "Service Thread" #8 daemon prio=9 os_prio=31 tid=0x00007fe884054000 nid=0x4703 runnable [0x0000000000000000]
  28. java.lang.Thread.State: RUNNABLE
  29.  
  30. "C1 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007fe884053000 nid=0x4503 waiting on condition [0x0000000000000000]
  31. java.lang.Thread.State: RUNNABLE
  32.  
  33. "C2 CompilerThread1" #6 daemon prio=9 os_prio=31 tid=0x00007fe884010000 nid=0x4303 waiting on condition [0x0000000000000000]
  34. java.lang.Thread.State: RUNNABLE
  35.  
  36. "C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007fe88380d000 nid=0x4103 waiting on condition [0x0000000000000000]
  37. java.lang.Thread.State: RUNNABLE
  38.  
  39. "Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007fe88380c800 nid=0x3f0b runnable [0x0000000000000000]
  40. java.lang.Thread.State: RUNNABLE
  41.  
  42. "Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007fe883807000 nid=0x3203 in Object.wait() [0x00007000059c9000]
  43. java.lang.Thread.State: WAITING (on object monitor)
  44. at java.lang.Object.wait(Native Method)
  45. - waiting on <0x00000007955870b8> (a java.lang.ref.ReferenceQueue$Lock)
  46. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
  47. - locked <0x00000007955870b8> (a java.lang.ref.ReferenceQueue$Lock)
  48. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
  49. at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
  50.  
  51. "Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fe88281e000 nid=0x3003 in Object.wait() [0x00007000058c6000]
  52. java.lang.Thread.State: WAITING (on object monitor)
  53. at java.lang.Object.wait(Native Method)
  54. - waiting on <0x0000000795586af8> (a java.lang.ref.Reference$Lock)
  55. at java.lang.Object.wait(Object.java:502)
  56. at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
  57. - locked <0x0000000795586af8> (a java.lang.ref.Reference$Lock)
  58.  
  59. "VM Thread" os_prio=31 tid=0x00007fe884006800 nid=0x2e03 runnable
  60.  
  61. "GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fe884003800 nid=0x2607 runnable
  62.  
  63. "GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fe884004000 nid=0x2803 runnable
  64.  
  65. "GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fe884004800 nid=0x2a03 runnable
  66.  
  67. "GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fe884005000 nid=0x2c03 runnable
  68.  
  69. "VM Periodic Task Thread" os_prio=31 tid=0x00007fe883809000 nid=0x4903 waiting on condition
  70.  
  71. JNI global references: 6
  72.  
  73. Found one Java-level deadlock:
  74. =============================
  75. "Thread-1":
  76. waiting to lock monitor 0x00007fe882822a18 (object 0x0000000795780bb0, a java.lang.Object),
  77. which is held by "Thread-0"
  78. "Thread-0":
  79. waiting to lock monitor 0x00007fe882823d58 (object 0x000000079577c6d8, a java.lang.Object),
  80. which is held by "Thread-1"
  81.  
  82. Java stack information for the threads listed above:
  83. ===================================================
  84. "Thread-1":
  85. at com.javaconcurrency.synchronized4.DeadLock.m2(DeadLock.java:20)
  86. - waiting to lock <0x0000000795780bb0> (a java.lang.Object)
  87. at com.javaconcurrency.synchronized4.OtherService.s2(OtherService.java:21)
  88. - locked <0x000000079577c6d8> (a java.lang.Object)
  89. at com.javaconcurrency.synchronized4.DeadLockTest$2.run(DeadLockTest.java:22)
  90. "Thread-0":
  91. at com.javaconcurrency.synchronized4.OtherService.s1(OtherService.java:14)
  92. - waiting to lock <0x000000079577c6d8> (a java.lang.Object)
  93. at com.javaconcurrency.synchronized4.DeadLock.m1(DeadLock.java:14)
  94. - locked <0x0000000795780bb0> (a java.lang.Object)
  95. at com.javaconcurrency.synchronized4.DeadLockTest$1.run(DeadLockTest.java:13)
  96.  
  97. Found deadlock.
  98.  
  99. xiongweideMacBook-Pro:wechat_jump_game xiongwei$

其中可以在这个命令的最后语句中看到如下提示:

那具体原因是怎么造成的呢?从命令行中的提示就可以分析得出:

所以如果实际项目中就可以通过这个命令去查询死锁的问题。

java线程基础巩固---多线程死锁分析,案例介绍的更多相关文章

  1. java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解

    继续学习一下Thread的构造函数,在上次[http://www.cnblogs.com/webor2006/p/7760422.html]已经对如下构造都已经学习过了: 多线程与JVM内存结构的关系 ...

  2. java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法

    在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...

  3. Java线程基础及多线程的实现

    一.进程和线程 1.进程:正在运行的程序         是系统进行资源分配和调用的独立单位         每一个进程都有它自己的内存空间和系统资源 2.线程是进程中的单个顺序控制流,是一条执行路径 ...

  4. java线程基础巩固---通过实验分析This锁和Class锁的存在

    This锁: 关于什么是This锁下面用实现来说明一下它: 那下面用两个线程分别调用这两个方法,如下: 看结果: 可见两个方法是同时输出的,因为m2()方法并未上锁,所以就不存在争锁的问题,那这时给m ...

  5. Java线程池ThreadPoolExecutor使用和分析(一)

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  6. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  7. java线程池ThreadPoolExector源码分析

    java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...

  8. Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  9. Java 线程基础

    Java 线程基础

随机推荐

  1. CommMonitor10.0.3串口过滤工具(serial port monitor)

    CommMonitor  串行端口监视精灵是用于RS232 / RS422 / RS485端口监控的专业强大的系统实用程序软件.CommMonitor监视显示,记录和分析系统中的所有串行端口活动.这是 ...

  2. leetcode1105 Filling Bookcase Shelves

    思路: dp[i]表示摆放好前i本书所需要的最小代价. 实现: class Solution { public: int minHeightShelves(vector<vector<in ...

  3. python 字体染色

    字体染色 <font face="黑体">我是黑体字</font> <font face="微软雅黑">我是微软雅黑< ...

  4. golang 中 map 转 struct

    golang 中 map 转 struct package main import ( "fmt" "github.com/goinggo/mapstructure&qu ...

  5. python 列表List - python基础入门(13)

    列表是python开发过程中最常用的数据类型之一,列表俗称:list ,特点如下: 1.列表由一个或者多个数据构成,数据的类型可以不相同也可以相同: 2.列表中的数据需要写在[]中括号内部,数据与数据 ...

  6. Stream入门及Stream在JVM中的线程表现

    继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式. 小实验引入: 这 ...

  7. [转帖]最佳 Linux 发行版汇总

    最佳 Linux 发行版汇总 https://cloud.tencent.com/developer/article/1505186 以后说不定用的到. Linux入门 Ubuntu Ubuntu是一 ...

  8. [转帖]Swagger介绍及使用

    Swagger介绍及使用 32018.12.07 01:39:21字数 2241阅读 89207 https://www.jianshu.com/p/349e130e40d5 导语: 相信无论是前端还 ...

  9. jmeter BeanShell实例-----两个变量之间的断言对比(转)

    jmeter BeanShell实例-----两个变量之间的断言对比 在jmeter的中,断言没法对两个变量的进行对比后判断,只能使用Bean Shell断言来进行,总是有人来问怎么写呢.这里写一个简 ...

  10. poj 3069 继续弱鸡的贪心

    题意:给出指路石的范围,问最小需要几个指路石可以覆盖所有的军队. 题解:排序一遍,然后扫出起始区间和终止区间,就可以求出最小的覆盖数了 ac代码: #include <iostream> ...