23

Semaphoreクラスでの公平性プロパティの有用性を理解しようとしています。

具体的には、Javadoc の言及を引用すると、次のようになります。

一般に、リソースへのアクセスを制御するために使用されるセマフォは、公平に初期化して、リソースへのアクセスでスレッドが枯渇しないようにする必要があります。他の種類の同期制御にセマフォを使用する場合、不公平な順序付けによるスループットの利点は、多くの場合、公平性の考慮事項を上回ります。

ここで割り込みが必要な例を誰かが提供できますか。過去のリソースアクセスのユースケースは考えられません。また、デフォルトが不公平な行動であるのはなぜですか?

最後に、公平性の動作を使用することでパフォーマンスに影響はありますか?

4

1 に答える 1

40

Java の組み込みの並行性構造 ( synchronizedwait()notify()、...) は、ロックが解放されたときにどのスレッドを解放するかを指定しません。使用するアルゴリズムを決定するのは、JVM の実装次第です。

公平性により、より詳細な制御が可能になります。ロックが解放されると、待機時間が最も長いスレッドにロックが与えられます (FIFO 処理)。公平性がなければ (そして非常に悪いアルゴリズムを使用すると)、他のスレッドの継続的なストリームがあるため、スレッドが常にロックを待機している状況が発生する可能性があります。

Semaphore が公平に設定されている場合、ロックを待機しているすべてのスレッドのキューを維持する必要があるため、わずかなオーバーヘッドが発生します。高スループット/高パフォーマンス/多くのコアのアプリケーションを作成していない限り、おそらく違いはわかりません!

公平性が不要なシナリオ

N 個の同一のワーカー スレッドがある場合、どのスレッドがタスクを実行するかは問題ではありません

公平性が必要なシナリオ

N 個のタスク キューがある場合、1 つのキューが永遠に待機し、ロックを取得しないことは望ましくありません。

于 2013-07-24T05:51:07.547 に答える