This question already has answers here:
question about concurrency code from oracle.com that explains Deadlock
(4个答案)
7个月前关闭。
我正在关注有关并发性的oracle文档,在deadlock section中,它们使用以下示例。问题是我不太了解为什么会导致死锁。
正如我所看到的,这就是我正在发生的事情:
阿方斯鞠躬加斯顿并获得
Alphonse离开
加斯顿重复该过程
但是我一定是错的,因为如果您运行代码,则会导致死锁……我在这里缺少什么?
非常感谢!
(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