2013-10-22 23 views
3

我正在通過Jakob Jenkov的一個併發教程。在這裏他提到有時候notify()信號會被等待線程漏掉。這怎麼可能?java中遺漏了什麼信號?如何調用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,我沒有找到在谷歌上的這個答案....在此先感謝

回答

8

如果doNotify之前調用doWait信號可以錯過。所以doNotify應標記它被稱爲。通常的做法是使用一個變量。取消對wasSignalled的所有用法的註釋,並且信號不會被錯過。

-2

提示:

public synchronized void foo() { ... } 

是完全相同的

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

這是更好地利用第一個版本爲了便於閱讀和可能的編譯器優化。