我正在阅读Jakob Jenkov的一个并发教程。在此他提到有时通过等待线程可以错过notify()信号。这怎么可能?
public class MissedSignal {
//boolean wasSignalled = false;
public void doWait() {
synchronized (this) {
//if(!wasSignalled){
try {
this.wait();
} catch (InterruptedException e) {
}
//}
}
}
public void doNotify() {
synchronized (this) {
//wasSignalled = true;
this.notify();
}
}
}
我无法理解此代码的注释部分的使用。我认为等待线程永远不会错过notify()信号?有人可以解释一下......我是java新手,我没有在谷歌上找到这个答案....在此先感谢
答案 0 :(得分:8)
如果在doNotify
之前调出doWait
,则可能会错过信号。所以doNotify
应该以某种方式标记它被调用。通常的方法是使用变量。取消注释wasSignalled
的所有用法,不会遗漏信号。
答案 1 :(得分:-2)
提示:
public synchronized void foo() { ... }
与
完全相同public void foo() { synchronized(this) { ... } }
最好使用第一个版本以便于阅读和可能的编译器优化。