死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行下去。下面是一个简单的Java代码示例,演示了如何产生死锁:
```java
public class DeadlockExample {
public static void main(String[] args) {
final Object resource1 = new Object();
final Object resource2 = new Object();
Thread thread1 = new Thread(() -> {
synchronized (resource1) {
System.out.println("Thread 1: Holding resource 1...");
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println("Thread 1: Waiting for resource 2...");
synchronized (resource2) {
System.out.println("Thread 1: Holding resource 1 and 2...");
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (resource2) {
System.out.println("Thread 2: Holding resource 2...");
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println("Thread 2: Waiting for resource 1...");
synchronized (resource1) {
System.out.println("Thread 2: Holding resource 1 and 2...");
}
}
});
thread1.start();
thread2.start();
}
}
```
在这个例子中,两个线程分别尝试获取两个资源,每个线程在获取了第一个资源后,都会尝试获取第二个资源。如果两个线程同时运行,它们都会在尝试获取第二个资源时阻塞,从而导致死锁。
要避免死锁,可以采取以下措施:
避免嵌套锁:
尽量避免在一个线程中获取多个锁。
锁顺序:
如果必须获取多个锁,确保所有线程都按照相同的顺序获取锁。
锁超时:
在获取锁时设置超时时间,如果超时则释放已获取的锁,稍后再尝试获取。
死锁检测:
使用工具或算法来检测和避免死锁,例如银行家算法。
通过理解死锁的产生原因和采取适当的预防措施,可以有效地避免和解决死锁问题。