java解决死锁的三种方法,java死锁的原因及解决方法
一、死锁的定义
死锁是指两个或两个以上的进程在执行过程中争夺资源或互相通信而导致的阻塞现象。如果没有外力,他们就无法前进。
那么我们换一个更标准的定义:集合中的每个进程都在等待一个只能被集合中其他进程触发的事件,那么这组进程就死锁了。
免费视频教程推荐:java免费视频教程
二、Java 代码模拟死锁
代码示例:
/**
*模拟死锁类
* */
公共类模仿死锁{
公共静态void main(String[] args) {
最终对象a=新对象();
最终对象b=新对象();
//线程threadA,获取对象A的锁后,休眠10秒,尝试获取对象b的锁。
Thread threadA=新线程(new Runnable() {
@覆盖
公共无效运行(){
同步(a) {
System.out.println(threadA获取对象A的锁);
尝试{
thread . sleep(10000);
同步(b) {
System.out.println(threadA获取对象B的锁);
}
} catch (InterruptedException e) {
e . printstacktrace();
}
}
}
});
//线程threadB,获取对象B的锁后,休眠10秒,尝试获取对象a的锁。
Thread threadB=新线程(new Runnable() {
@覆盖
公共无效运行(){
同步(b) {
System.out.println(threadB获取对象B的锁);
尝试{
thread . sleep(10000);
同步(a) {
System.out.println(threadB获取对象A的锁);
}
} catch (InterruptedException e) {
e . printstacktrace();
}
}
}
});
threada . start();
threadb . start();
}
}运行结果:
ThreadA获取对象a的锁。
ThreadB获取对象b的锁。
无限的等待.
三、如何解决
1、确认问题
(1)Jps Jstack命令
Jps:查看当前流程
如下图所示,类名为ImitateDeadLock的进程就是我们需要查看的进程。
C:\Users\31415
1256仿迪洛克
9240 Jps
748 org . eclipse . equinox . launcher _ 1 . 3 . 100 . v 2015 05 11-1540 . jar jstack:查看堆栈信息
执行jstack命令后,会显示两个线程在互相等待,导致死锁。
C:\Users\31415jstack 1256
上面列出的线程的Java堆栈信息:
===================================================
“线程-1”:
at模仿阅读锁$2.run(模仿阅读锁. java:37)
-等待锁定0x 048 b15a 8(Java . lang . object)
-锁定的0x 048 b 15 b 0(Java . lang . object)
位于Java . lang . thread . run(thread . Java:745)
“线程-0”:
at模仿阅读锁$1.run(模仿阅读锁. java:17)
-等待锁定0x 048 b 15 b 0(Java . lang . object)
-锁定的0x 048 b 15 a 8(Java . lang . object)
位于Java . lang . thread . run(thread . Java:745)
发现1个死锁。2、处理问题
(1)获取确定序列中的锁
例如,在我们上面的演示中,两个线程都首先获取对象A的锁,当它们获取对象B的锁时,就不会出现死锁。
(2)超时后放弃。
使用synchronized关键字提供的内置锁时,只要线程没有得到锁,就会一直等待下去。但是锁接口提供了布尔trylock (long time,time unit unit)抛出中断异常方法,可以固定时间等待锁,所以线程可以在锁获取超时后主动释放之前获取的所有锁。这样,也可以有效地避免死锁。
更多相关教程,请访问:java入门。以上是java中如何解决死锁问题的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。