2012-01-01 6 views
7

私はこれらの2つの記述について非常に紛らわしいです:通知方法は、1スレッドを待ってブロック解除が、あきらめていません」「waitメソッド呼び出しスレッドをブロックし、モニターロック断念」Javaスレッドでwaitメソッドとnotifyメソッドを理解するにはどうすればよいですか?

  1. をロックを監視する「ここで

は私の質問です:

  1. 私は、Javaの各オブジェクトがロックを持って知っているが、何である」MONIロックを意味する?それはojectのロックと同じですか?

  2. なぜnotifyメソッドは、モニタロックを放棄する必要がありますか?

  3. 私は次のコードで待機しているオブジェクト作成しようとした場合:上記の最初の説明と同様に

    class simpleTask extends Thread 
    { 
        int waitingTime; 
    
        public simpleTask(int waitingTime) 
        { 
         this.waitingTime = waitingTime; 
        } 
    
        public void run() 
        { 
         synchronized(this) // this is a reference of current object 
         { 
         try { 
          this.wait(waitingTime); 
         } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
    } 
    

を、であることは、現在のオブジェクトはsynchronizedキーワードによってブロックされることを意味し、次に待ちますメソッドはロックを解除しますか?

答えて

7

私はJavaの各オブジェクトがロックを持っていることを知っていますが、「モニタロック」は何を意味していますか?オブジェクトのロックと同じですか?

はい、同じです。また、オブジェクトの「ミューテックス」およびオブジェクトの「プリミティブロック」と呼ばれることもあります。 (誰かがおよそLockを語るとき、彼らはおよそthis Java interfaceを話している... 異なるロック機構である。)

なぜ方法がモニターロックを放棄する必要があります通知?

ロックを放棄しませんnotify方法。ロックを放棄するのはコードの責任です(つまり、notify呼び出しが返された後に、synchronizedブロックを終了するか、synchronizedメソッドから戻ります)。

なぜ必要なのですか?ロックを現在待機中の他のスレッド(wait(...)呼び出し中)は、wait呼び出しが完了する前にそのロックを再獲得する必要があるためです。

なぜ彼らはnotify/waitのようにデザインしましたか?そのため、条件変数の実装に使用できます。

これは、現在のオブジェクトがsynchronizedキーワードによってブロックされていることを意味し、waitメソッドはロックを解除しますか?

これは間違いありません。スレッドがsomeObject.wait()を呼び出すと、someObjectのロックが解放され、wait()呼び出しが戻る前に(同じスレッドによって)再度取得されます。もちろん、その間にロックsomeObjectが取得され、他のスレッドによって複数回リリースされました。要点は、waitが返されたときに、waitを呼び出したスレッドがロックを持つことです。

+0

あなたの答えをありがとう!しかし、あなたの説明で:someObject.wait()を呼び出すとsomeObjectのスレッドのロックが解放され、wait()コールが戻る前に再取得され、wait()コールが戻る前にロックを再取得するでしょうか?再度、感謝します! –

+0

@Miles Zhang:同じスレッドが利用可能であれば、同じスレッドがそれを再取得します(つまり、他のスレッドがまだ獲得していないスレッド)。 – Tudor

+0

@MilesZhang - 解明する答えを更新しました。 –

0
  1. はい、モニタロックはオブジェクトのロックと同じです。 synchronized (object)を実行すると、それがロックになります。

  2. あなたの例では、現在のオブジェクトは待機中にロックを放棄し、wait()コールはロックを放棄します。別のスレッドでは、オブジェクトを起動するためにnotify()が呼び出され、wait()呼び出しが戻ると、再びロックが保持されます。

+0

あなたの答えをありがとう! –

0

A monitor is a type of synchronization construct.

他のスレッドは、このような待ちたいかもしれない他のスレッドとして、ロックを獲得できるように待機がロックをあきらめることに理由があります。また、競合状態を防止するために、スレッドを解放する前に他のスレッドを目覚めさせるスレッドが普通です。

詳細については、条件変数(つまり、条件式)を学習する必要があります。

+0

ありがとう!私は条件変数に関する知識を得るでしょう。 –