我不明白为什么这段代码会导致死锁

I don't understand why this code is causing a deadlock

我正在关注有关并发性的 oracle 文档,在 deadlock section 他们使用了以下示例。问题是我不太明白为什么会导致死锁。

在我看来,这就是我猜它正在发生的事情:

但我一定是错的,因为如果你 运行 代码,它会导致死锁......我在这里错过了什么?

非常感谢!

public class Deadlock
{
    public static void main(String[] args)
    {
        final Friend alphonse = new Friend("Alphonse");
        final Friend gaston = new Friend("Gaston");

        new Thread(() -> alphonse.bow(gaston)).start();
        new Thread(() -> gaston.bow(alphonse)).start();
    }


    static class Friend
    {
        private final String name;


        Friend(final String name)
        {
            this.name = name;
        }


        String getName()
        {
            return name;
        }


        synchronized void bow(final Friend bower)
        {
            System.out.printf("%s: %s has bowed to me!%n", this.name, bower.getName());
            bower.bowBack(this);
        }


        synchronized void bowBack(final Friend bower)
        {
            System.out.printf("%s: %s has bowed back to me!%n", this.name, bower.getName());
        }
    }
}

假设两个线程都在 System.out.printf 行的 bow 中。当他们尝试调用 bowBack 时,他们都需要在 bow 可以 return 释放锁之前获取另一个实例的锁。

由于两个线程都被锁定,等待对方解锁,这是一个死锁。

Alphonse leaves the bow method and goes into bowBack, releasing the first lock and acquiring the second one.

这是您的问题 - 当从 bow 调用 bowBack 时锁没有释放,但现在您还需要为另一个对象获取锁。只有当您 退出 bow 方法时才会释放锁,这只会在您退出从中调用的 bowBack 方法后发生。