编写Java代码实现一个死锁的案例 ?
参考答案:
下面是一个简单的Java代码示例,用于展示如何创建一个死锁的情况。在这个例子中,我们有两个线程,每个线程都试图获取两个锁,但是它们的获取顺序是相反的。因此,它们会陷入一个循环等待,从而导致死锁。
public class DeadlockExample {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void thread1Action() {
synchronized (lock1) {
System.out.println("线程1:持有lock1,等待lock2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("线程1:持有lock1和lock2,正在执行操作");
}
}
}
public void thread2Action() {
synchronized (lock2) {
System.out.println("线程2:持有lock2,等待lock1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("线程2:持有lock2和lock1,正在执行操作");
}
}
}
public static void main(String[] args) {
DeadlockExample deadlockExample = new DeadlockExample();
Thread thread1 = new Thread(() -> deadlockExample.thread1Action(), "线程1");
Thread thread2 = new Thread(() -> deadlockExample.thread2Action(), "线程2");
thread1.start();
thread2.start();
}
}
在这个代码中,我们创建了两个线程(线程1和线程2)。每个线程都试图获取两个锁(lock1和lock2),但是它们的获取顺序是相反的。线程1首先获取lock1,然后等待lock2;而线程2首先获取lock2,然后等待lock1。因此,这两个线程会陷入一个循环等待,导致死锁。
请注意,死锁是一个严重的问题,因为它会阻止程序继续执行。在实际的程序设计中,我们应该尽量避免创建可能导致死锁的情况。这通常可以通过仔细设计锁的获取和释放策略,以及使用更高级的并发控制工具(如Java的java.util.concurrent
包中的工具)来实现。