2

d が、wait を呼び出すために使用しているオブジェクトであるとします。スレッドが d.wait を呼び出すとき、スレッドは d の固有ロックを所有している必要があります — そうでない場合、エラーがスローされます。同期されたメソッド内で待機を呼び出すことは、固有のロックを取得する簡単な方法です。

これは、2 つのスレッドが同時に wait() を呼び出すことができないということですか? ここでの本質的なロックは何を意味しますか[モニターとして言及]? しかし、相互排除を達成するためにモニターをどのように実装しますか?

スレッドが待機を呼び出すと、オブジェクトは永久に保持されますか? もしそうなら、notifyAll() のためにそのロックを使用している他のスレッドはどうですか?

notifyall 中にオブジェクトを取得する必要がある場合、待機中のすべてのスレッドが通知されるのはなぜですか? そのオブジェクトだけを待っているスレッドに通知するべきではありませんか?

説明するコードは大歓迎です。

4

4 に答える 4

3

これは、2 つのスレッドが同時に wait() を呼び出すことができないということですか?

正しい 2 つのスレッドが同時に wait() を呼び出すことはできません。ただし、1 つのスレッドが wait() に入ると、別のスレッドが同じロックを取得し、すぐに wait() 状態に入る可能性があります。同じオブジェクトで任意の数のスレッドを待機させることができますが、実際にロックを保持しているのは 1 つだけです。

ここでの本質的なロックは何を意味しますか[モニターとして言及]? しかし、相互排除を達成するためにモニターをどのように実装しますか?

オブジェクトを保持している間、実行できるスレッドは 1 つだけです。他のスレッドがロックを取得しようとしてブロックしている可能性があり、さらに多くのスレッドがロックを待機している可能性があります。

スレッドが待機を呼び出すと、オブジェクトは永久に保持されますか?

反対に、それを放棄するか、別のスレッドがほぼ即座に取得できます。

もしそうなら、notifyAll() のためにそのロックを使用している他のスレッドはどうですか?

オブジェクトで notifyAll() を呼び出すと、すべての wait() スレッドが順番に起こされます。これらのスレッドは一度に 1 つのロックしか取得できず、ロックを取得できるとすぐに再取得します。

notifyall 中にオブジェクトを取得する必要がある場合、待機中のすべてのスレッドが通知されるのはなぜですか?

これは、notifyAll が行うことです。notify を使用するよりも安全であると考えられています。

そのオブジェクトだけを待っているスレッドに通知するべきではありませんか?

それがそれがすることです。


注意する必要があります。

  • notify()/notifyAll() する前に、状態変更を実行する必要があります。また、その状態の変化をチェックするループ内で wait() する必要があります。これを行う必要があるのは、a) wait() が notify() を見逃す可能性があるためです。b) 誤ってウェイクアップする可能性があります。c) 別のスレッドがあなたが行ったことをすべて取得し、再度待機する必要がある可能性があるためです。
  • 過去 9 年間で、高レベルの同時実行クラスの使用が増えています。これらのクラスを使用すると、スレッド、キュー、wait()、notify() を直接操作する必要がなくなります。
于 2013-07-30T18:32:17.543 に答える
1

同期されたメソッド内で待機を呼び出すことは、固有のロックを取得する簡単な方法です。

待機はオブジェクトのロックを提供するのではなく、他のスレッド呼び出しが通知したときにスレッドがロックの解放についてリッスンするのを待機させます。スレッドが保護された//同期ブロックに入ると、スレッドはロックを取得します。同期されたブロック/メソッドは、利用可能な場合はロックを取得できます。それ以外の場合、スレッドはそれらのコード ブロックに入ることができません。

于 2013-07-30T18:18:35.160 に答える
0

javadoc によると、ロックは永久に保持されるわけではありません。

スレッドは、このモニターの所有権を解放し、別のスレッドが、このオブジェクトのモニターで待機しているスレッドに、notify メソッドまたは notifyAll メソッドの呼び出しによってウェイクアップを通知するまで待機します。スレッドは、モニターの所有権を再度取得できるまで待機し、実行を再開します。

于 2013-07-30T18:20:56.407 に答える