【问题标题】:I don't understand why this code is causing a deadlock [duplicate]我不明白为什么这段代码会导致死锁[重复]
【发布时间】:2019-09-11 08:08:33
【问题描述】:

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

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

  • Alphonse 向 Gaston 鞠躬并获得了 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());
        }
    }
}

【问题讨论】:

  • 这是正确的@michalk,与这里的问题相同,我必须将我的问题标记为重复还是删除它?非常感谢!

标签: java concurrency deadlock synchronized


【解决方案1】:

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

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

【讨论】:

  • 但这怎么可能呢?如果bow 被阿尔方斯锁住了,加斯顿就进不去吧?那是我不明白的事情:S
  • synchronized 锁定类的一个特定实例,而不是类的所有实例。两人都可以在bow内;他们每个人都有一个单独的锁。见the Oracle tutorial
  • 哇...我在理解并发方面遇到了严重的麻烦...非常感谢您的帮助!我需要消化这些新信息,因为我现在完全不明白为什么这对我有用……再次感谢!
【解决方案2】:

Alphonse 离开 bow 方法并进入 bowBack,释放第一个锁并获取第二个锁。

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

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多