我不明白为什么这段代码会导致死锁
I don't understand why this code is causing a deadlock
我正在关注有关并发性的 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());
}
}
}
假设两个线程都在 System.out.printf
行的 bow
中。当他们尝试调用 bowBack
时,他们都需要在 bow
可以 return 释放锁之前获取另一个实例的锁。
由于两个线程都被锁定,等待对方解锁,这是一个死锁。
Alphonse leaves the bow method and goes into bowBack, releasing the first lock and acquiring the second one.
这是您的问题 - 当从 bow
调用 bowBack
时锁没有释放,但现在您还需要为另一个对象获取锁。只有当您 退出 bow
方法时才会释放锁,这只会在您退出从中调用的 bowBack
方法后发生。
我正在关注有关并发性的 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());
}
}
}
假设两个线程都在 System.out.printf
行的 bow
中。当他们尝试调用 bowBack
时,他们都需要在 bow
可以 return 释放锁之前获取另一个实例的锁。
由于两个线程都被锁定,等待对方解锁,这是一个死锁。
Alphonse leaves the bow method and goes into bowBack, releasing the first lock and acquiring the second one.
这是您的问题 - 当从 bow
调用 bowBack
时锁没有释放,但现在您还需要为另一个对象获取锁。只有当您 退出 bow
方法时才会释放锁,这只会在您退出从中调用的 bowBack
方法后发生。