This question already has answers here:
question about concurrency code from oracle.com that explains Deadlock
                                
                                    (4个答案)
                                
                        
                7个月前关闭。
            
        

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

正如我所看到的,这就是我正在发生的事情:


阿方斯鞠躬加斯顿并获得bow方法的锁定
Alphonse离开bow方法进入bowBack,释放第一个锁并获取第二个锁。
加斯顿重复该过程


但是我一定是错的,因为如果您运行代码,则会导致死锁……我在这里缺少什么?

非常感谢!

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());
        }
    }
}

最佳答案

假设两个线程都在bow行中的System.out.printf中。当他们尝试调用bowBack时,他们都需要在bow返回并释放这些锁之前获得另一个实例的锁。

由于两个线程均被锁定,等待彼此解锁,因此这是一个死锁。

08-04 02:32