跳到主要内容

编写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包中的工具)来实现。