java线程基础巩固---多线程死锁分析,案例介绍
之前已经学习了关于同步锁的知识,但是在实际编写多线程程序时可能会存在死锁的情况,所以这次来模拟一下死锁,并且学会用一个命令来确认是否程序已经出现死锁了,下面开始:
首先新建两个类:
此时当然得到OtherService类中增加这个s1()方法喽,如下:
目前是DeadLock调用了OtherService的方法,这时反过了,让OtherService去调用DeadLock类的方法,所以代码如下:
所以此时在DeadLock中新建一个m2()方法,如下:
此时编写测试代码来测试一下,首先构造相关依赖的关系,如下:
接下来新建两个线程然后发起方法调用,具体如下:
接下来编译运行:
执行了一段之后程序卡住了,而且进程一直没有结束,其实这就是典型死锁原因造成,用什么方式来以查看到这个死锁的状态呢?其实可以通过一个命令行可以查询,具体如下:
先用"jps"命令查看当前程序的进程号,如下:
然后用"jstack"命令查看该进程的线程情况,如下:
xiongweideMacBook-Pro:wechat_jump_game xiongwei$ jstack 99374
2018-02-04 15:13:00
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode): "Attach Listener" #12 daemon prio=9 os_prio=31 tid=0x00007fe88404b000 nid=0x1107 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "DestroyJavaVM" #11 prio=5 os_prio=31 tid=0x00007fe88380e000 nid=0x1a03 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "Thread-1" #10 prio=5 os_prio=31 tid=0x00007fe883087000 nid=0x4d03 waiting for monitor entry [0x00007000061e1000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.javaconcurrency.synchronized4.DeadLock.m2(DeadLock.java:20)
- waiting to lock <0x0000000795780bb0> (a java.lang.Object)
at com.javaconcurrency.synchronized4.OtherService.s2(OtherService.java:21)
- locked <0x000000079577c6d8> (a java.lang.Object)
at com.javaconcurrency.synchronized4.DeadLockTest$2.run(DeadLockTest.java:22) "Thread-0" #9 prio=5 os_prio=31 tid=0x00007fe88381a000 nid=0x4b03 waiting for monitor entry [0x00007000060de000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.javaconcurrency.synchronized4.OtherService.s1(OtherService.java:14)
- waiting to lock <0x000000079577c6d8> (a java.lang.Object)
at com.javaconcurrency.synchronized4.DeadLock.m1(DeadLock.java:14)
- locked <0x0000000795780bb0> (a java.lang.Object)
at com.javaconcurrency.synchronized4.DeadLockTest$1.run(DeadLockTest.java:13) "Service Thread" #8 daemon prio=9 os_prio=31 tid=0x00007fe884054000 nid=0x4703 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "C1 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007fe884053000 nid=0x4503 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" #6 daemon prio=9 os_prio=31 tid=0x00007fe884010000 nid=0x4303 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007fe88380d000 nid=0x4103 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007fe88380c800 nid=0x3f0b runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE "Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007fe883807000 nid=0x3203 in Object.wait() [0x00007000059c9000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007955870b8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x00000007955870b8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) "Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fe88281e000 nid=0x3003 in Object.wait() [0x00007000058c6000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000795586af8> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
- locked <0x0000000795586af8> (a java.lang.ref.Reference$Lock) "VM Thread" os_prio=31 tid=0x00007fe884006800 nid=0x2e03 runnable "GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007fe884003800 nid=0x2607 runnable "GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007fe884004000 nid=0x2803 runnable "GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007fe884004800 nid=0x2a03 runnable "GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007fe884005000 nid=0x2c03 runnable "VM Periodic Task Thread" os_prio=31 tid=0x00007fe883809000 nid=0x4903 waiting on condition JNI global references: 6 Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007fe882822a18 (object 0x0000000795780bb0, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007fe882823d58 (object 0x000000079577c6d8, a java.lang.Object),
which is held by "Thread-1" Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.javaconcurrency.synchronized4.DeadLock.m2(DeadLock.java:20)
- waiting to lock <0x0000000795780bb0> (a java.lang.Object)
at com.javaconcurrency.synchronized4.OtherService.s2(OtherService.java:21)
- locked <0x000000079577c6d8> (a java.lang.Object)
at com.javaconcurrency.synchronized4.DeadLockTest$2.run(DeadLockTest.java:22)
"Thread-0":
at com.javaconcurrency.synchronized4.OtherService.s1(OtherService.java:14)
- waiting to lock <0x000000079577c6d8> (a java.lang.Object)
at com.javaconcurrency.synchronized4.DeadLock.m1(DeadLock.java:14)
- locked <0x0000000795780bb0> (a java.lang.Object)
at com.javaconcurrency.synchronized4.DeadLockTest$1.run(DeadLockTest.java:13) Found deadlock. xiongweideMacBook-Pro:wechat_jump_game xiongwei$
其中可以在这个命令的最后语句中看到如下提示:
那具体原因是怎么造成的呢?从命令行中的提示就可以分析得出:
所以如果实际项目中就可以通过这个命令去查询死锁的问题。
java线程基础巩固---多线程死锁分析,案例介绍的更多相关文章
- java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解
继续学习一下Thread的构造函数,在上次[http://www.cnblogs.com/webor2006/p/7760422.html]已经对如下构造都已经学习过了: 多线程与JVM内存结构的关系 ...
- java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法
在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...
- Java线程基础及多线程的实现
一.进程和线程 1.进程:正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 2.线程是进程中的单个顺序控制流,是一条执行路径 ...
- java线程基础巩固---通过实验分析This锁和Class锁的存在
This锁: 关于什么是This锁下面用实现来说明一下它: 那下面用两个线程分别调用这两个方法,如下: 看结果: 可见两个方法是同时输出的,因为m2()方法并未上锁,所以就不存在争锁的问题,那这时给m ...
- Java线程池ThreadPoolExecutor使用和分析(一)
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- java线程池ThreadPoolExector源码分析
java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...
- Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java 线程基础
Java 线程基础
随机推荐
- 写一个java常用的加密工具类
1.叙述 java security包下有很多加密算法类,我们可以很简单的调用它们.他们虽然功能很全,但是使用起来步骤有些繁琐.我在这里封装来一些常用的加密算法及他们常用的一些方法,来简化代码. 工具 ...
- 安装CCS提示错误Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机
问题如图所示: 解决方案: 放在D:\目录下 windows键+X 选择 命令提示符(管理员) 一定要是管理员 打开cmd 分别执行下面两句.红色部分就是自己的更新程序了.其他安装同理 例如Wi ...
- 2017年度好视频,吴恩达、李飞飞、Hinton、OpenAI、NIPS、CVPR、CS231n全都在
我们经常被问:机器翻译迭代了好几轮,专业翻译的饭碗都端不稳了,字幕组到底还能做什么? 对于这个问题,我们自己感受最深,却又来不及解释,就已经边感受边做地冲出去了很远,摸爬滚打了一整年. 其实,现在看来 ...
- JavaSE基础(二)--Java环境配置
Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. Windows 上安装开发环境 Linux 上安装开发环境 安装 Eclipse 运行 Java window系统安装ja ...
- 一个后端开发者的前端语言基础:JavaScript
JavaScript (一) 基本概述 (1) 概述 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的 ...
- [转帖]超详细的PostgreSQL体系结构总结,值得收藏
超详细的PostgreSQL体系结构总结,值得收藏 https://www.toutiao.com/i6715390855772897800/ 原创 波波说运维 2019-07-26 00:03:00 ...
- Gossip协议
Gossip数据传播协议: Fabric通过将工作负载划分到事务执行(背书和提交)对等节点和事务排序节点,优化了区块链网络性能.安全性和可伸缩性.这种网络操作的解耦需要一个安全.可靠和可伸缩的数据传播 ...
- Maven配置、使用
一:什么是Maven Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件. Maven提供了开发人员构建一个完整的生命周期框架,开发人员可以自动完成 ...
- 其实每个行业都有各自的辛苦,好的程序员并不累,他们乐此不疲(见过太多在职位事业、人生方向上随转如流的人,累了疲乏了就去做别的事情了。必须有自己的坚守和立足的点,自我驱动,否则沦为在别人的体制制度中被驱赶一生)good
作者:陈柯好链接:https://www.zhihu.com/question/39813913/answer/104275537来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- delete删除数据造成归档日志增加,操作系统空间不足导致数据库hang住
业务需求,对日志表历史数据进行清理.历史表均很大,使用delete 操作删除90天前的数据. 第一部分:快速删除数据 SQL> alter table CC.F_LOG parallel ; S ...