2

谁能告诉我为什么这段代码会出现死锁?

public class BrokenOrderingReentredLock implements Runnable {

    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public static void main(String[] args) throws InterruptedException {
        BrokenOrderingReentredLock runnable = new BrokenOrderingReentredLock();
        Thread thread1 = new Thread(runnable, "thread1");
        Thread thread2 = new Thread(runnable, "thread2");
        thread1.start();
        Thread.sleep(500);
        thread2.start();
    }

    @Override
    public void run() {
        try {
            String threadName = Thread.currentThread().getName();
            synchronized (lock1) {
                System.out.println(threadName + " has lock1");
                synchronized (lock2) {
                    System.out.println(threadName + " has lock2");
                        System.out.println(threadName + " reenters lock1");
                        lock1.wait();
                        lock2.wait();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    } }
4

2 回答 2

7

Thread1开始并得到lock1lock2Thread1发布lock1(带有lock1.wait())。

Thread2开始并得到然后永远lock1等待。正在等待通知,但永远不会。lock2Thread1

僵局!

于 2013-10-02T14:10:14.830 回答
0

发生的事情是 thread1 获得 lock1 上的锁,然后获得 lock2 上的锁。Thread1 然后调用 lock1.wait 释放 lock1 上的锁并使 thread1 在那里等待,直到有人调用 notify(这永远不会发生)。

Thread2 出现并获得 lock1 的锁定。然后它被阻止获取 lock2 上的锁,因为 thread1 仍然拥有锁。

如果您在 lock1.wait 和 lock2.wait 之间放置一条消息,您将看到两个线程都没有达到那么远,因此 lock2 上的锁永远不会被释放。

于 2013-10-02T14:24:30.337 回答