概念
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
死锁产生主要原因
1. 进程运行推进的顺序不合适
2. 资源分配不当
3. 系统资源不足
代码示例
线程a,b相互持有并期望,造成死锁
public class DeadLockDemo {
static Object lockA = new Object();
static Object lockB = new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+" 持有A锁,期待获得B锁");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+" 获得B锁");
}
}
},"a").start();
new Thread(()->{
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+" 持有B锁,期待获得A锁");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+" 获得A锁");
}
}
},"b").start();
}
}
排查死锁(如何证明发生了死锁)
1. jps 获取PID
jps获取PID为940
2. jstack PID (Found 1 deadlock.)
jstack 940 -> Found 1 deadlock