複数のウェイトセットを持つことが利点である理由を具体的に説明するには、次のようにします。
スレッドが待機しているさまざまなものがあるかどうかを待機/通知します(一般的な例は、固定サイズのブロックキューで、一部のスレッドはキューに入れてキューがいっぱいになるとブロックし、他のスレッドはキューから取得してブロックしますキューが空の場合)、notifyを使用して、スケジューラーが待機セットから1つのスレッドを選択して通知する場合、選択したスレッドが特定の状況について通知されることに関心がないというコーナーケースが発生する可能性があります。たとえば、キューはキューに何かを追加するように通知しますが、選択したスレッドがプロデューサーであり、キューがいっぱいの場合、その通知に基づいて動作することはできません。組み込みロックでは、通知が失われないようにするために、notifyAllを使用する必要があります。
ただし、notifyAllはすべての呼び出しでチャーンを発生させ、すべてのスレッドがウェイクアップしてロックを争いますが、進行できるのは1つだけです。他のスレッドはすべて、一度に1つずつロックを取得して待機に戻るまで、ロックを争ってぶつかります。あまりメリットがないために多くの競合が発生します。通知を使用して、通知がそのスレッドに関連する1つのスレッドのみが通知されることを認識できることが望ましいでしょう。
これは、待機する個別の条件を持つことが大きな改善であるところです。キューは条件でシグナルを呼び出すことができ、そのスレッドが特に条件を待機している1つのスレッドのみをウェイクアップすることを認識できます。
ConditionのAPIドキュメントには、制限付きバッファーに複数の条件を使用することを示すコード例があります。
アイテムまたはスペースがバッファーで使用可能になったときに一度に1つのスレッドにのみ通知するという最適化を使用できるように、putスレッドを待機し続け、スレッドを別々の待機セットに入れたいと考えています。