首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不明白为什么这段代码会导致死锁

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

Stack Overflow用户
提问于 2019-09-11 08:08:33
回答 2查看 64关注 0票数 0

我遵循关于并发性的oracle文档,在死锁段中,它们使用下面的示例。问题是我不太明白为什么这会导致僵局。

在我看来,这就是我想要发生的事情:

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

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

非常感谢!

代码语言:javascript
复制
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());
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-11 08:12:08

假设两个线程都在bow中,位于System.out.printf行中。当他们试图调用bowBack时,他们都需要获得另一个实例上的锁,然后bow才能返回并释放锁。

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

票数 4
EN

Stack Overflow用户

发布于 2019-09-11 08:14:51

阿方斯离开弓法进入bowBack,释放第一锁,获得第二锁。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57884780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档