通常の状況下では、複数のスレッドがリソースの少数へのアクセスを必要とするがあるかもしれません。いくつかの仮定の答えクライアントを実行すると、サーバー上のスレッドを要求します。これらのスレッドは、同じデータベースに接続する必要がありますが、任意の時間が唯一のデータベース接続の特定の数を取得することができます。どのように効果的に多数のスレッドに、これらのデータベースの固定数を割り当てる接続することができますか?井戸信号数(セマフォカウント)の量ことが知られて用い、(単にロックに加えて)リソースのセットにアクセスするための制御方法。 セマフォのカウントは、カプセル化された利用可能なリソースのセットを管理します。セマフォは、makeスレッドセーフ実行の同等の簡易ロックに基づいて実施され、カウンタは、利用可能なリソースの数に初期化されます。たとえば、私たちは、セマフォは、データベース接続の数に初期化され得ることができます。スレッドは、セマフォ、使用可能なデータベース接続がマイナス1の数を取得したら。スレッドが資源の消費やリソースの解放を完了すると、カウンタがインクリメントされます。セマフォ制御のすべてのリソースが使用されている場合は、スレッドがこのセマフォにアクセスしようとした場合、利用可能なリソースが解放されるまで、それはブロッキングステートになります。
セマフォ最も一般的な使用法が解決しようとする「消費者 - 。プロデューサーの問題を」別のスレッドが同じ共有変数にアクセスする場合は、スレッドの仕事は、それが可能である場合には、この問題を生成します。生産者スレッドがデータにアクセスすることができた後、消費者のスレッドでの生産にのみ行うことができます。ブロッキングは、あなたがこの問題を解決するために、セマフォを使用する場合、あなたは消費者がこのスレッドセマフォにアクセスできるように、ゼロに初期化セマフォを作成する必要が発生します。作業単位の完了は、プロデューサスレッドは、セマフォ(リリースリソース)へ信号を送信するたびに。生産実績の単位当りの消費者のスレッドの消費量と、新しいデータユニットのため必要があるとき、それは再びセマフォを取得しようとします。したがってセマフォ値が常に終了消費者の生産のためのデータ単位の数に等しいです。消費者のスレッドを使用するよりも、このアプローチは、常にはるかに効率的にデータユニットの利用できる方法があるかどうかを確認してください。消費者スレッドがウェイクアップしているので、利用可能なデータユニットが見つからない場合、それは再びスリープ状態に入るだろう、このオペレーティングシステムのオーバーヘッドは非常に高価です。
セマフォが直接Java言語でサポートされていませんが、上のロックされたターゲットに基づいて実装するのは非常に簡単です。次のように単純な実装方法は次のとおりです。
class Semaphore {
private int count;
public Semaphore(int n) {
this.count = n;
}
public synchronized void acquire() {
while(count == 0) {
try {
wait();
} catch (InterruptedException e) {
//keep trying
}
}
count--;
}
public synchronized void release() {
count++;
notify(); //alert a thread that's blocking on this semaphore
}
}
ます。https://my.oschina.net/kt431128/blog/224700で再現