MST

星途 面试题库

面试题:Java多线程死锁问题:场景分析

假设有两个线程Thread1和Thread2,有两个资源ResourceA和ResourceB。Thread1先获取ResourceA,然后尝试获取ResourceB;Thread2先获取ResourceB,然后尝试获取ResourceA。请用Java代码实现这个场景,并分析可能产生死锁的原因。
31.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码实现

public class DeadlockExample {
    private static final Object ResourceA = new Object();
    private static final Object ResourceB = new Object();

    public static void main(String[] args) {
        Thread Thread1 = new Thread(() -> {
            synchronized (ResourceA) {
                System.out.println("Thread1 获取了 ResourceA");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (ResourceB) {
                    System.out.println("Thread1 获取了 ResourceB");
                }
            }
        });

        Thread Thread2 = new Thread(() -> {
            synchronized (ResourceB) {
                System.out.println("Thread2 获取了 ResourceB");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (ResourceA) {
                    System.out.println("Thread2 获取了 ResourceA");
                }
            }
        });

        Thread1.start();
        Thread2.start();
    }
}

死锁原因分析

  1. 资源竞争:Thread1 和 Thread2 竞争 ResourceA 和 ResourceB 这两个资源。
  2. 加锁顺序不一致:Thread1 先获取 ResourceA 锁,再尝试获取 ResourceB 锁;而 Thread2 先获取 ResourceB 锁,再尝试获取 ResourceA 锁。
  3. 资源持有和等待:当 Thread1 获取 ResourceA 锁,Thread2 获取 ResourceB 锁后,两者都进入等待对方释放锁的状态,导致死锁。因为 Thread1 等待 Thread2 释放 ResourceB 锁,而 Thread2 等待 Thread1 释放 ResourceA 锁,双方都不会主动释放已持有的锁,从而形成死循环等待,造成死锁。