Java面试题之多线程 实现一个死锁?
在Java中,死锁是指两个或多个线程在执行过程中,因为争夺资源而造成的一种互相等待的状态。为了实现一个简单的死锁示例,我们可以创建两个线程,每个线程都持有一个锁并试图获取另一个线程持有的锁。以下是一个简单的示例代码:
public class DeadlockExample {
// 创建两个锁
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
// 创建第一个线程
Thread thread1 = new Thread(() -> {
synchronized (lock1) {
System.out.println("Thread 1: Holding lock 1...");
// 暂停一段时间以确保线程2能够获得lock2
try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("Thread 1: Waiting for lock 2...");
synchronized (lock2) {
System.out.println("Thread 1: Acquired lock 2!");
}
}
});
// 创建第二个线程
Thread thread2 = new Thread(() -> {
synchronized (lock2) {
System.out.println("Thread 2: Holding lock 2...");
// 暂停一段时间以确保线程1能够获得lock1
try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("Thread 2: Waiting for lock 1...");
synchronized (lock1) {
System.out.println("Thread 2: Acquired lock 1!");
}
}
});
// 启动线程
thread1.start();
thread2.start();
}
}
lock1
和 lock2
,它们将作为锁使用。lock1
后,线程1 休眠一段时间,然后尝试获取 lock2
。lock2
后,线程2 也休眠一段时间,然后尝试获取 lock1
。lock1
并等待 lock2
,而线程2持有 lock2
并等待 lock1
,这就导致了死锁。