gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:43:31 25 4
gpt4 key购买 nike

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

据我所知,这就是我猜正在发生的事情:

  • 阿尔方斯向加斯顿鞠躬并获得 bow 的锁方法
  • 阿尔方斯离开 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());
}
}
}

最佳答案

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

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

关于java - 我不明白为什么这段代码会导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57884780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com