此代码来自Oracle tutorial关于并发性。我不明白为什么同步方法导致deadlock
。当方法不是synchronized
时,一切正常,但是当我添加synchronized
关键字时,程序停止并且永远不会调用方法bowBack()
。有人能以负担得起的方式解释为什么会这样吗下面提到了代码段:
public class Deadlock {
static class Friend {
private final String name;
Friend(String name) {
this.name = name;
}
String getName() {
return this.name;
}
synchronized void bow(Friend bower) {
System.out.format("%s: %s"
+ " has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}
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();
}
}
答案 0 :(得分:4)
因此两个线程都被阻塞,等待另一个线程释放锁定。
答案 1 :(得分:1)
synchronized
方法意味着它锁定正在运行它的对象实例。
因此,当您在每个bow
上调用Friend
时,它会自行锁定。
然后,每个Friend
实例尝试bowBack
,但另一个实例被其自己bow
锁定,因此无法调用。
在这种情况下,两个线程都在等待资源解锁。由于他们实际上正在等待彼此的资源,这是一个僵局。