死锁是并发编程中常见的问题,可通过采取措施预防或处理:预防死锁:-按顺序获取锁-避免循环等待-使用超时机制-使用非阻塞数据结构处理死锁:-死锁检测-死锁恢复-重试操作
Java 并发编程中的死锁预防和处理
死锁是并发编程中可能遇到的一个常见问题,它会导致多个线程相互等待对方释放资源,从而导致系统陷入僵局。在 Java 中,可以通过采取适当措施来预防或处理死锁。
预防死锁
处理死锁
如果预防措施无法防止死锁,则可以通过以下方法处理死锁:
实战案例
考虑以下 Java 代码段:
public class DeadlockExample {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void method1() {
synchronized (lock1) {
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2");
}
}
}
public void method2() {
synchronized (lock2) {
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1");
}
}
}
public static void main(String[] args) {
DeadlockExample deadlockExample = new DeadlockExample();
Thread thread1 = new Thread(deadlockExample::method1);
Thread thread2 = new Thread(deadlockExample::method2);
thread1.start();
thread2.start();
}
}在这个例子中,两个线程(thread1 和 thread2)分别使用 lock1 和 lock2 进行同步。由于两个线程都按相反的顺序获取锁,因此它们会相互等待对方释放锁,从而导致死锁。
为了预防死锁,我们可以修改代码以按顺序获取锁:
public class DeadlockExample {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void method1() {
synchronized (lock1) {
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("Thread " + Thread.cur
rentThread().getName() + " acquired lock2");
}
}
}
public void method2() {
synchronized (lock2) {
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock2");
synchronized (lock1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread " + Thread.currentThread().getName() + " acquired lock1");
}
}
}
public static void main(String[] args) {
DeadlockExample deadlockExample = new DeadlockExample();
Thread thread1 = new Thread(deadlockExample::method1);
Thread thread2 = new Thread(deadlockExample::method2);
thread1.start();
thread2.start();
}
}通过修改代码,我们确保 thread1 和 thread2 总是在相同的顺序(lock1 然后锁 lock2)获取锁,从而防止死锁。