死锁 是指两个或多个进程在执行过程中,因为竞争资源而导致的一种互相等待的现象。具体来说,死锁是指两个或多个进程无法继续执行,因为每个进程都在等待另一个进程释放资源,造成了循环等待的情况。
1. 场景:
死锁通常发生在多个进程之间共享有限资源的情况下。每个进程都需要一组资源来执行其任务,这些资源可能是系统资源(如CPU、内存等)或其他进程所拥有的资源。当一个进程请求资源时,如果该资源已被另一个进程占用,那么当前进程将被阻塞,直到该资源被释放。如果多个进程同时等待彼此的资源,就会形成死锁。
示例: 有两个线程(线程1和线程2)分别去获取资源1和资源2。每个线程首先获取一个资源,然后休眠100毫秒,再去获取另一个资源。如果两个线程同时开始执行,线程1先获取资源1,线程2先获取资源2,然后两个线程都等待对方释放资源,导致死锁。
public class DeadlockExample {
private static Object resource1 = new Object();
private static Object resource2 = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (resource1) {
System.out.println("Thread 1 acquired resource 1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resource2) {
System.out.println("Thread 1 acquired resource 2");
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (resource2) {
System.out.println("Thread 2 acquired resource 2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resource1) {
System.out.println("Thread 2 acquired resource 1");
}
}
});
thread1.start();
thread2.start();
}
}
2. 解决方法:
预防死锁: 设计时避免产生死锁的情况,通过合理的资源分配和进程调度来预防死锁的发生。
避免死锁: 运行时检测系统的状态,通过合理的资源申请顺序来避免死锁的发生。
检测和恢复死锁: 运行时检测系统的状态,一旦发现死锁就采取相应的措施进行恢复,如资源剥夺、进程终止等。
忽略死锁: 认为死锁发生的概率极低,忽略死锁的发生,但一旦发生死锁,系统就会崩溃或重启。
总之,死锁是一种常见的并发问题,需要在设计和运行时采取相应的策略来预防、避免、检测和恢复死锁的发生,以确保系统的可靠性和稳定性。