2016-07-13 40 views
0

例如方法,如果我有這樣的代碼:是否有必要使用while語句代替if語句時使用線程等待()在Java中

public synchronized T get() throws Exception { 
     while (!condition()) { 
      try { 
       wait(); 
      } catch (Exception e) { 
       throw new Exception(e); 
      } 
      if (!condition()) { 
       throw new Exception(); 
      } 
     } 

     ... 
    } 

我可以用,如果切換時?

+1

不,你不能。閱讀[docs](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--):_「中斷和虛假喚醒是可能的,並且此方法應該始終在循環中使用「_ – Fildor

回答

1

是的,有必要。

一兩件事:也許會發生以下情況:

  1. 線程1點開始等待。
  2. 線程2開始等待。
  3. 線程3使條件成立並調用notifyAll。
  4. 線程1醒來。
  5. 線程1使條件再次失敗。
  6. 線程2醒來。

現在線程2不應該假設條件是真的,因爲它不是!

另外,虛假喚醒是可能的。這意味着wait可能根本沒有理由返回(或沒有任何理由與您的程序相關) - 例如,如果調試器附加到您的程序,它可能會返回。