This question already has answers here:
Question About Deadlock Situation in Java
(6个答案)
3年前关闭。
此代码来自Oracle tutorial关于并发性。我不明白为什么同步方法会导致
线程1:alphonse.bow(gaston)->线程1保持对alphonse的锁定,因为bow()是同步的 线程2:gaston.bow(alphonse)->线程2保持对gaston的锁定,因为bow()是同步的 线程1:gaston.bowBack(alphonse)->阻塞,因为bowBack已同步,因此线程1需要获取已由线程2 持有的加斯顿锁。线程2:alphonse.bowBack(gaston)->阻塞,因为bowBack是同步的,因此线程2需要获取已经由线程1 持有的alphonse锁。
因此,两个线程都被阻塞,等待另一个释放锁。
(6个答案)
3年前关闭。
此代码来自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();
}
}
最佳答案
因此,两个线程都被阻塞,等待另一个释放锁。
10-05 21:52