3

我正在阅读 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();
        }

    }
}

我无法理解此代码注释部分的使用。正如我认为等待线程永远不会错过通知()信号?有人可以解释一下...我是java新手,我没有在谷歌上找到这个答案....在此先感谢

4

2 回答 2

7

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

于 2013-10-22T04:59:10.683 回答
-2

暗示:

public synchronized void foo() { ... }

public void foo() { synchronized(this) { ... } }

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

于 2013-10-22T06:49:23.563 回答