【发布时间】:2019-08-14 04:10:53
【问题描述】:
在下面的代码中,有可能进入类似于这个问题“Deadlocks and Synchronized methods”的死锁,现在我明白为什么两个线程正在进入 死锁,但是当我执行代码时,线程总是进入死锁,所以:
1 - 此代码中何时不可能出现死锁?
2 - 如何防止它发生?
我尝试像这样使用 wait() 和 notifyAll() :
wait()
waver.waveBack(this)
然后在 waveBack() 中调用 notifyAll(),但它不起作用我错过了什么或误解了什么?
package mainApp;
public class Wave {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void wave(Friend waver) {
String tmpname = waver.getName();
System.out.printf("%s : %s has waved to me!%n", this.name, tmpname);
waver.waveBack(this);
}
public synchronized void waveBack(Friend waver) {
String tmpname = waver.getName();
System.out.printf("%s : %s has waved back to me!%n", this.name, tmpname);
}
}
public static void main(String[] args) {
final Friend friendA = new Friend("FriendA");
final Friend friendB = new Friend("FriendB");
new Thread(new Runnable() {
public void run() {
friendA.wave(friendB);
}
}).start();
new Thread(new Runnable() {
public void run() {
friendB.wave(friendA);
}
}).start();
}
}
【问题讨论】:
-
总是以相同的顺序获取锁。
-
只有在您尝试等待某些特定条件时才能使用
wait,该条件受您在等待时释放的锁的保护。你调用notifyAll来提醒其他线程条件可能已经改变,但如果条件实际上没有改变,这将毫无用处。 -
.wait()和notify()是相当低级的工具,很难正确使用。查看java.util.concurrent中的任何工具,例如Semaphore是否有帮助;他们更容易使用。 Effective Java Item 69 更详细地介绍了如何安全使用wait()和notify()。
标签: java multithreading methods deadlock synchronized