オブジェクト O のモニターを待機している 3 つのスレッド (A、B、および C) があるとします。現在、スレッド D はオブジェクト O のモニターを持っています。スレッド D が O.notify を呼び出すと、どのスレッドが最初に通知を受けるのでしょうか? A、B、またはC?オブジェクト O で wait() を呼び出す最初のスレッドに基づいていますか? おそらく、notify() と notifyAll() の違いについて話しているのでしょうか。私が推測すると、notify() は最初のスレッドに wait() を呼び出すように通知し、notifyAll() は wait() を呼び出したすべてのスレッドに通知し、モニターを取得する次のスレッドは基本的にランダムですか?
質問する
478 次
1 に答える
4
モニターで待機しているスレッドです。JLS のセクション 17.2.2から:
待機セット内のどのスレッドが選択されるかは保証されません。この待機セットからの削除により、待機アクションでの u の再開が可能になります。ただし、再開時の u のロック アクションは、t が m のモニターを完全にロック解除してからしばらく経たないと成功しないことに注意してください。
そしてObject.notify
ドキュメントから:
このオブジェクトのモニターで待機している単一のスレッドを起動します。このオブジェクトを待機しているスレッドがある場合は、そのうちの 1 つが選択されて起動されます。選択は任意であり、実装の裁量で行われます。スレッドは、メソッドの 1 つを呼び出して、オブジェクトのモニターで待機し
wait
ます。
于 2013-08-04T17:19:32.400 に答える