JAVA多线程——死锁分析
来源:互联网 发布:windows loader 3.1.0 编辑:程序博客网 时间:2024/05/06 15:55
线程死锁的原因:当两个或多个线程正在等待对方占有的锁,死锁就会发生
死锁会导致两个线程无法继续运行,被永远挂起。
简单的死锁例子
创建两个互相等待对方释放锁的线程
public class DeadLock1 implements Runnable { private Object o1, o2; public DeadLock1(Object o1, Object o2) { this.o1 = o1; this.o2 = o2; } @Override public void run() { fun(); } public void fun() { //获取o1的monitor synchronized (o1) { try { TimeUnit.MILLISECONDS.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } //获取o2的monitor synchronized (o2) { } } }}
public class DeadLock2 implements Runnable { private Object o1, o2; public DeadLock2(Object o1, Object o2) { this.o1 = o1; this.o2 = o2; } @Override public void run() { fun(); } public void fun() { //获取o2的monitor synchronized (o2) { try { TimeUnit.MILLISECONDS.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } //获取o1的monitor synchronized (o1) { } } }}
创建测试类
public class TestDeadLock { public static void main(String[] args) { Object lockObj1 = new Object(); Object lockObj2 = new Object(); //分别启动两个线程 Thread thread1 = new Thread(new DeadLock1(lockObj1, lockObj2)); thread1.start(); Thread thread2 = new Thread(new DeadLock2(lockObj1, lockObj2)); thread2.start(); }}
运行并打印堆栈信息:
Found one Java-level deadlock:============================="Thread-1": waiting to lock monitor 0x0000000054a4d6b8 (object 0x00000000eb540e20, a java.lang.Object), which is held by "Thread-0""Thread-0": waiting to lock monitor 0x0000000054a4c218 (object 0x00000000eb540e30, a java.lang.Object), which is held by "Thread-1"Java stack information for the threads listed above:==================================================="Thread-1":at zj.test.deadlock.DeadLock2.fun(DeadLock2.java:33)- waiting to lock <0x00000000eb540e20> (a java.lang.Object)- locked <0x00000000eb540e30> (a java.lang.Object)at zj.test.deadlock.DeadLock2.run(DeadLock2.java:19)at java.lang.Thread.run(Thread.java:745)"Thread-0":at zj.test.deadlock.DeadLock1.fun(DeadLock1.java:33)- waiting to lock <0x00000000eb540e30> (a java.lang.Object)- locked <0x00000000eb540e20> (a java.lang.Object)at zj.test.deadlock.DeadLock1.run(DeadLock1.java:19)at java.lang.Thread.run(Thread.java:745)Found 1 deadlock.
线程0想要lock <0x00000000eb540e30>
线程1想要lock <0x00000000eb540e20>
双方都在等待对方释放锁
对于真正的死锁而言,虚拟机从锁的持有和请求情况就能判断出来,因此打印堆栈时虚拟机会自动给出死锁的提示
许多人把系统无响应的问题统称为死锁,这种称为是不恰当的
真正意义上的死锁是由于代码引入的错误而导致的死锁
要想从死锁中恢复临时也是唯一的规避办法是将系统重启,然后赶快去修改导致这个死锁的BUG
能否及时发现死锁,依赖于你的运气和你准备的测试用例的有效性
tips:死锁的两个或多个线程是不消耗CPU的
0 0
- JAVA多线程——死锁分析
- JAVA多线程死锁分析
- Java多线程——死锁
- Java多线程(八)——死锁
- Java多线程初探——死锁
- Java多线程(6)——死锁
- Java多线程㈢—死锁(示例)
- 多线程死锁问题分析和解决[java]
- 多线程——死锁
- 多线程——死锁
- 多线程——死锁产生的条件和过程分析
- 【Java多线程】多线程死锁
- 多线程死锁分析
- java自学笔记————多线程之死锁;
- java多线程-java死锁
- Java多线程技术初识——5. 死锁
- Java多线程(3)——死锁问题
- 黑马程序员:Java基础——多线程的死锁问题
- Spring向Servlet中注入实例
- PHP multipart/form-data 远程DOS漏洞
- 对齐
- 多线程:NSOperation 的高级功能
- C++ # 条件编译的理解
- JAVA多线程——死锁分析
- 关于Xcode的错误分析和处理
- __kindof 与 __typeof
- 多线程:NSOperation 的依赖使用
- JAVA里面的“指针”
- JavaScript删除数组重复元素的5个高效算法
- 微博的MySQL数据库优化实践经验
- 注册输入校验
- 通过js框架jquery判断IE浏览器版本来解决浏览器兼容性问题