2016-12-13 18 views
0

コード1:java無限の待ち問題?

class BCWCExamples { 
    public Object lock; 

    boolean someCondition; 

    public void NoChecking() throws InterruptedException { 
     synchronized(lock) { 
      //Defect due to not checking a wait condition at all 
      lock.wait(); 
     } 
    } 

コード2:

public void IfCheck() throws InterruptedException { 
      synchronized(lock) { 
       // Defect due to not checking the wait condition with a loop. 
       // If the wait is woken up by a spurious wakeup, we may continue 
       // without someCondition becoming true. 
       if(!someCondition) { 
        lock.wait(); 
       } 
      } 
     } 

コード3:

public void OutsideLockLoop() throws InterruptedException { 
      // Defect. It is possible for someCondition to become true after 
      // the check but before acquiring the lock. This would cause this thread 
      // to wait unnecessarily, potentially for quite a long time. 
      while(!someCondition) { 
       synchronized(lock) { 
        lock.wait(); 
       } 
      } 
     } 

コード4:

public void Correct() throws InterruptedException { 
      // Correct checking of the wait condition. The condition is checked 
      // before waiting inside the locked region, and is rechecked after wait 
      // returns. 
      synchronized(lock) { 
       while(!someCondition) { 
        lock.wait(); 
       } 
      } 
     } 
    }  

注:いくつかの他そこから通知されます場所

ありそう無限の待ち時間があり、コード1のウェイトのための条件はありませんが、無限の待ち時間は他の3のコード(2,3,4)
に発生している理由を親切により良く理解するためにコード内のコメントをご確認ください親切に私を助けてください私はJavaで新しいです通知して通知する

+0

が、これは、関連するコードのentireityですか?値someConditionは決してtrueに設定されません –

答えて

関連する問題