一、什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
二、产生死锁的主要原因:
1.系统资源不足;
2.进程运行推进的顺序不合适;
3.资源分配不当。
三、模拟死锁代码。
package com;
import java.util.concurrent.TimeUnit;
class HoldThread implements Runnable{
private String lockA;
private String lockB;
public HoldThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA){
System.out.println(Thread.currentThread().getName() +"\t自己持有锁"+lockA+"尝试获得"+lockB);
try{
TimeUnit.SECONDS.sleep(1);
} catch(InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName() +"\t自己持有锁"+lockB+"尝试获得"+lockA);
}
}
}
}
/**
* 死锁是指两个或者以上的进程在执行过程中,
* 因争夺资源而造成的一种相互等待的现象,
* 若无外力干涉那他们都将无法推进下去
*/
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldThread(lockA,lockB),"threadA").start();
new Thread(new HoldThread(lockB,lockA),"threadB").start();
}
}
结果:
四、如何排除?
1.使用jps -l 查出进程号:
2.根据上面的进程号,结合jstack 命令。查出原因:jstack 16660。
进程threadB 持有了<0x000000076bad0c28> 资源,在等待<0x000000076bad0bf0> 资源。
进程threadA持有了0x000000076bad0bf0>资源,在等待<0x000000076bad0c28> 资源。