我遵循关于并发性的oracle文档,在死锁段中,它们使用下面的示例。问题是我不太明白为什么这会导致僵局。
在我看来,这就是我想要发生的事情:
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());
}
}
}发布于 2019-09-11 08:12:08
假设两个线程都在bow中,位于System.out.printf行中。当他们试图调用bowBack时,他们都需要获得另一个实例上的锁,然后bow才能返回并释放锁。
由于两个线程都被锁定,等待对方解锁,所以这是一个死锁。
发布于 2019-09-11 08:14:51
阿方斯离开弓法进入bowBack,释放第一锁,获得第二锁。
这是您的问题--当从bowBack调用bow时,锁没有释放,但是现在您也需要为另一个对象获取锁。只有在退出bow方法时才会释放锁,只有在退出调用的bowBack方法之后才会发生这种情况。
https://stackoverflow.com/questions/57884780
复制相似问题