java中错过了什么信号?如何通过等待线程调用notify()?

时间:2013-10-22 04:50:41

标签: java multithreading

我正在阅读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新手,我没有在谷歌上找到这个答案....在此先感谢

2 个答案:

答案 0 :(得分:8)

如果在doNotify之前调出doWait,则可能会错过信号。所以doNotify应该以某种方式标记它被调用。通常的方法是使用变量。取消注释wasSignalled的所有用法,不会遗漏信号。

答案 1 :(得分:-2)

提示:

public synchronized void foo() { ... }

完全相同
public void foo() { synchronized(this) { ... } }

最好使用第一个版本以便于阅读和可能的编译器优化。