私は待ち状態の3つのスレッドと、通知条件付きの4番目のスレッドがあるとします。どのスレッドが起床を通知しますか?
3つの待機スレッドがすべて実行され、待機状態になります。これが完了すると、4番目のスレッドが実行され、通知が1回だけ呼び出されます。
通知によってどのスレッドが起床するかはどのように決定されますか? waitを最初に呼び出すスレッド、waitを最後に呼び出したスレッド、または他の条件に基づいているスレッドですか?
待機と通知が同じロックを使用すると仮定します。
私は待ち状態の3つのスレッドと、通知条件付きの4番目のスレッドがあるとします。どのスレッドが起床を通知しますか?
3つの待機スレッドがすべて実行され、待機状態になります。これが完了すると、4番目のスレッドが実行され、通知が1回だけ呼び出されます。
通知によってどのスレッドが起床するかはどのように決定されますか? waitを最初に呼び出すスレッド、waitを最後に呼び出したスレッド、または他の条件に基づいているスレッドですか?
待機と通知が同じロックを使用すると仮定します。
私の知るところでは、はありません。特別簿記 - 選択は「ランダム」に行われます。
のでjavadocは言う:
任意のスレッドがこのオブジェクトで待機している場合は、そのうちの一つが起こされるように選択されます。選択は任意であり、実装の裁量で発生します。
したがって、JVM実装が特定の順序を制定することを決定すること理論的可能であろう。示されているように、デフォルトでは、いかなる命令も期待できません。したがって、そのような特定の順序に依存するコードを書くべきではありません。
notify()メソッドのドキュメントを参照してください。
このオブジェクトのモニタで待機している1つのスレッドを起動します。 このオブジェクトを待機しているスレッドがある場合は、そのうちの1つが になるように選択されます。 選択は任意であり、 の実装の裁量で発生します。
少なくともあなたが懸念している限り、ランダムなものです。そこからjavadocs: "このオブジェクトを待っているスレッドがあれば、それらのうちの1つが目覚められるように選択されます。選択は任意であり、実装の裁量で発生します。 – yshavit