これは、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() を直接操作する必要がなくなります。