単純なJavaスレッドセマフォの例

通常の状況下では、複数のスレッドがリソースの少数へのアクセスを必要とするがあるかもしれません。いくつかの仮定の答えクライアントを実行すると、サーバー上のスレッドを要求します。これらのスレッドは、同じデータベースに接続する必要がありますが、任意の時間が唯一のデータベース接続の特定の数を取得することができます。どのように効果的に多数のスレッドに、これらのデータベースの固定数を割り当てる接続することができますか?井戸信号数(セマフォカウント)の量ことが知られて用い、(単にロックに加えて)リソースのセットにアクセスするための制御方法。 セマフォのカウントは、カプセル化された利用可能なリソースのセットを管理します。セマフォは、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で再現

おすすめ

転載: blog.csdn.net/weixin_34240520/article/details/91952482
おすすめ