Java多线程同步问题:死锁案例分析
死锁是多线程编程中的一种严重问题。当两个或更多的线程在执行过程中,因争夺资源而造成的一种互相等待的现象称为死锁。
以下是一个简单的Java死锁案例:
// 线程1
class Thread1 extends Thread {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void run() {
synchronized(lock1) {
System.out.println("Thread 1: Acquire lock 1");
try {
// 等待锁2,模拟资源争夺
synchronized(lock2) {
System.out.println("Thread 1: Wait for lock 2");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread 1: Interrupted while waiting for lock 2");
}
System.out.println("Thread 1: Release lock 1");
}
// 等待锁1释放,模拟资源争夺
synchronized(lock1) {
System.out.println("Thread 1: Wait for lock 1 to release");
}
}
}
// 线程2
class Thread2 extends Thread {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void run() {
synchronized(lock1) {
System.out.println("Thread 2: Acquire lock 1");
try {
// 等待锁2释放,模拟资源争夺
synchronized(lock2) {
System.out.println("Thread 2: Wait for lock 2 to release");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread 2: Interrupted while waiting for lock 2 to release");
}
System.out.println("Thread 2: Release lock 1");
}
// 等待锁1释放,模拟资源争夺
synchronized(lock1) {
System.out.println("Thread 2: Wait for lock 1 to release");
}
}
}
public class Main {
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start();
thread2.start();
}
}
在这个案例中,线程1首先获取到锁1,然后等待锁2释放。与此同时,线程2也是先获取锁1,然后等待锁1释放。
如果线程2在等待锁1释放期间被中断(例如,操作系统认为线程不应该继续运行),那么线程2将无法获取到锁1,从而导致死锁。
还没有评论,来说两句吧...