什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那么它们都将无法推进下去,如果系统资源充足,进程的资源请求都得到满足,死锁出现的可能性就很低,否则就会争夺有限的资源而陷入死锁。
产生死锁的条件:
1.相互排斥:当一个线程获得资源后,其他线程必须等待。
2.一旦抢占了资源,就不会主动释放。
3.不可被抢占,获取资源后,不会被抢占。
4.循环等待。
注:打破任一条件,即可破坏死锁。
避免死锁的几个常用方法:
1.避免一个线程同时获取多个锁。
2.避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
3.也可以尝试使用lock.tryLock(timeout)来代替使用内部锁机制。
死锁代码示例:
public class DeadLock {
static Object A = new Object();
static Object B = new Object();
public static void main(String[] args) {
deadLock();
}
public static void deadLock() {
new Thread(() -> {
synchronized (A) {
System.out.println("t1 == A ===");
synchronized (B) {
System.out.println("t1 == B ===");
}
}
},"t1").start();
new Thread(() -> {
synchronized (B) {
System.out.println("t2 == A ===");
synchronized (A) {
System.out.println("t2 == B ===");
}
}
},"t2").start();
}
}
死锁定位分析:
1.通过 " jps -l "命令定位进程号
2.通过 " jstack + 进程号 " 命令找到死锁详细信息。
例: jstack 52380