java死锁示例及分析排查
来源:互联网 发布:仙境传说激活码淘宝 编辑:程序博客网 时间:2024/05/10 20:28
死锁是指多个线程循环等待它方占有的资源而无限期地僵持下去的局面。如有o1与o2两个资源,线程t1持有o1后,如果再持有o2,就能正常完成操作,不巧,这时另一个线程t2已经持有o2,若再持有o1,则能完成操作,这样就互相等对方持有的资源,产生死锁。
一 、 示例。
1、定义资源
package thread.deadlock;
public class CustomObject {}
2、线程1实现
package thread.deadlock;public class LockT1 implements Runnable{private CustomObject o1;private CustomObject o2;public LockT1(CustomObject o1, CustomObject o2) {super();this.o1 = o1;this.o2 = o2;}@Overridepublic void run() {// TODO Auto-generated method stubsynchronized(o1){try {System.out.println(Thread.currentThread().getName()+ " hold o1");Thread.sleep(5000);synchronized(o2){System.out.println(Thread.currentThread().getName()+ " hold o2");}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
package thread.deadlock;public class LockT2 implements Runnable{private CustomObject o1;private CustomObject o2;public LockT2(CustomObject o1, CustomObject o2) {super();this.o1 = o1;this.o2 = o2;}@Overridepublic void run() {// TODO Auto-generated method stubsynchronized(o2){try {System.out.println(Thread.currentThread().getName()+ " hold o2");Thread.sleep(1000);synchronized(o1){System.out.println(Thread.currentThread().getName()+ " hold o1");}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
3、跑起来
package thread.deadlock;public class T {public static void main(String[] args) {CustomObject o1 = new CustomObject();CustomObject o2 = new CustomObject();Thread t1 = new Thread(new LockT1(o1,o2),"t1");Thread t2 = new Thread(new LockT2(o1,o2),"t2");t1.start();t2.start();}}
二、排查
工具:jstack 或 jvisualvm.exe
dump线程执行信息
Found one Java-level deadlock:
=============================
"t2":
waiting to lock monitor 0x000000000226b168 (object 0x00000007ab11de78, a thread.deadlock.CustomObject),
which is held by "t1"
"t1":
waiting to lock monitor 0x0000000010bbe3e8 (object 0x00000007ab11de88, a thread.deadlock.CustomObject),
which is held by "t2"
可以看到t1和t2线程相互持有待的资源,thread.deadlock.CustomObject 为锁住的资源所属的类
0 0
- java死锁示例及分析排查
- Java死锁示例及检测
- Java死锁的排查
- 每日学习20170711--JAVA死锁排查利器
- Java模拟排查线程死锁问题
- Java基础:死锁示例
- java死锁代码示例
- java的死锁示例
- 死锁,Java简单示例
- Java死锁代码示例
- java 死锁及避免死锁
- 我的Mysql死锁排查过程(案例分析)
- JVM的线程状态及如何排查死锁原因
- Java实现的死锁示例
- java死锁的原因分析及解锁和预防措施
- JAVA多线程死锁分析
- Java死锁问题分析
- java死锁及解决
- 【读过的书,留下的迹】Unix网络编程
- GreenDao通过字符串转换存对象集合
- docker wordpress 文件2M上传限制问题
- C跟C++mem函数的类型及用法
- .NET编码规范
- java死锁示例及分析排查
- PHP for循环的写法和示例
- 强行在MFC窗体中渲染Cocos2d-x 3.6
- DockerCon_2017_那些Docker的新技术你们怎么看?
- Maven处理依赖冲突
- Android 匿名共享内存驱动源码分析
- JAVA开发之 1-JAVA语言发展史
- 协方差矩阵
- 美食地图-上海食堂