为什么这个人为的Java代码deadlock?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (65)

有以下代码:

public class Uninterruptible {
    public static void main(String[] args) throws InterruptedException {
        final Object o1 = new Object(); final Object o2 = new Object();

        Thread t1 = new Thread() {
            public void run() {
                try {
                    synchronized(o1) {
                        Thread.sleep(1000);
                        synchronized(o2) {}
                    }
                } catch(InterruptedException e) { System.out.println("t1 interrupted"); }
            }
        };

        Thread t2 = new Thread() {
            public void run() {
                try {
                    synchronized(o2) {
                        Thread.sleep(1000);
                        synchronized(o1) {}
                    }
                } catch(InterruptedException e) { System.out.println("t2 interrupted"); }
            }
        };

        t1.start(); t2.start();
        Thread.sleep(2000);
        t1.interrupt(); t2.interrupt();
        t1.join(); t2.join();

        System.out.println("Donezo!");

    }
}
提问于
用户回答回答于

内部synchronized块无所作为并不重要,Java仍将尝试获取指定对象的锁定,无论你在内部synchronized块中没有任何内容或大量处理,你所拥有的是创建死锁的最小例子:两个不同的线程,每个线程拥有不同资源上的锁,每个线程都尝试获取每个其他的资源,deadlock发生在任一线程甚至执行内部synchronized块之前,因为两个线程都不能同时获取两个资源上的锁。

扫码关注云+社区

领取腾讯云代金券