Java多线程并发编程中的死锁问题实例
死锁是多线程并发编程中常见的问题。当两个或更多的线程在执行过程中因争夺资源而造成的一种互相等待的现象,就称为死锁。
以下是一个简单的Java死锁例子:
// 线程1
public class Thread1 extends Thread {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void run() {
synchronized (lock1) { // 死锁条件1:锁A持有
try {
System.out.println("Thread 1 acquired lock1");
// 在这里,线程2可能会等待锁1释放
synchronized (lock2) { // 死锁条件2:锁B持有
System.out.println("Thread 1 acquired lock2");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 线程2
public class Thread2 extends Thread {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void run() {
synchronized (lock1) { // 死锁条件1:锁A持有
try {
System.out.println("Thread 2 acquired lock1");
// 在这里,线程1可能会等待锁2释放
synchronized (lock2) { // �死锁条件2:锁B持有
System.out.println("Thread 2 acquired lock2");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start(); // 启动线程1
thread2.start(); // 启动线程2
try {
// 线程执行完毕后,主线程等待
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在这个例子中,线程1和线程2分别持有锁A和锁B。当一个线程获得锁A并尝试获取锁B时(条件2),如果此时另一个线程已经获得了锁B并试图获取锁A(条件1),就会形成死锁。
还没有评论,来说两句吧...