2012-01-11 5 views
5

は、次のコードを考えてみましょう: -notifyメソッドがsynchronizedブロック内にあるのはなぜですか?

class CalculateSeries implements Runnable{ 
    int total; 
    public void run(){ 
     synchronized(this){       // *LINE 1* 
      for(int i = 1; i <= 10000; i++) { 
       total += i; 
      } 

      notify(); //Notify all the threads waiting on this instance of the class to wake up 
     } 
    } 
} 

別のクラスは、同期ブロック内でその上にロックを取得することによって、このクラスのインスタンスを待っています。しかし、コードを同期化されたブロックでrunメソッドに保持しないと、IllegalMonitorStateExceptionが返されます。

notify()は、待機しているすべてのスレッドにシグナルを与えることを意味します。ではなぜそれが同期化されたブロック内にあるべきですか?

+3

notifyは、待機中のすべてのスレッドに通知しません。 ** 1 **スレッド待ちを通知します。 –

+0

@JBNizetはい。それは本当だ。 notifyは、すべての適格なスレッドのうちの1つだけに通知します。 – whitehat

答えて

4

notify()は、待機中のすべてのスレッドにシグナルを与えることを意味します。

実際には、それは、と1つのを任意に選択した待機スレッドと合図します。 notifyAll()はそのすべてを通知します。

なぜ内部同期ブロックにする必要がありますか?

待ちは自分のために起こりません。条件が満たされているかどうかをチェックし、条件が満たされていない場合は、誰かがあなたに合っていることを伝えるまで待ってからもう一度チェックします。同期がないと、条件をチェックして実際に待機することの間で競合条件が発生します。

+2

これは、 'wait()'が 'synchronized'の中になければならない理由を説明しますが、' notify() 'は意味しません。たとえば、[C++ APIでは、これは明示的に推奨されていません](http://en.cppreference.com/w/cpp/thread/condition_variable/notify_one)に注意してください。だから、Javaがなぜそれを必要とするのかという疑問が残されています。 – Owen

関連する問題