5

時々、ウェイクアップするか、単一のスレッドをスリープ状態にする必要がありますが、それを行うための最良かつ最も効率的な方法は何でしょうか。

最初の解決策は、シグナリングと組み合わせることですwait-notify(このパターンを適切に実装する方法を知っていますが、それは問題ではありません)。

java.concurrentライブラリを使用し、CountDownLatchシグナリングに使用する方が効率的であるとどこかで読みました。私はconcurrent.locks.Conditionもチェックしましたが、このトピックでは、これは(プログラマー的に)より安全で一般化された構成であり、と比較してパフォーマンス上の利点はないと述べていnotify/notifyAllます。Peter Lawreyは、このコメントの代わりに同時実行ライブラリを使用することを推奨しているため、使用するベストプラクティスが何であるか混乱しています。notify-notifyAll

関連する質問:パフォーマンスの面で、notifyまたはnotifyAll私の場合(つまり、スレッドが1つある場合)はどちらが優れていますか?私はこれについて多くの同様のスレッドがあることを知っていますが、それらのどれも明確な答えを与えません。私の場合、機能的にはどちらを使用してもかまいませんが、どちらが速いのでしょうか。

4

2 に答える 2

3

IMOは、「パフォーマンスに関して」大きな違いはありません。それらはすべて、対応するものを呼び出すスレッドを一時停止するwaitため、基になるメカニズムが非常に似ている可能性が高いためです。とにかく、なぜパフォーマンスがそれほど重要なのでしょうか? シグナルが待機の直後に来る非常に高速な待機/シグナル パターンがない限り、コンテキスト スイッチのコストが高すぎて代わりにスピンロックが必要になる場合を除き、パフォーマンスについて心配する必要はありません。

プログラミング的に最も便利な方法と思われるものを実装してから、ベンチマークを行い、よりパフォーマンスの高いものが本当に必要かどうかを確認する必要があります。

于 2012-08-23T12:25:29.087 に答える
0

wait-notify完全に問題ありません。

notify待機リストにはスレッドが 1 つしかないため、 と の間にセマンティクスやパフォーマンスの点で違いはありませんnotifyAll

于 2012-08-24T15:41:33.737 に答える