モジュール java.base
パッケージ java.util.concurrent

クラスSemaphore

  • すべての実装じっそうされたインタフェース:
    Serializable


    public class Semaphore
    extends Object
    implements Serializable
    計数けいすうセマフォです。 概念的がいねんてきに、セマフォはパーミットのセットを維持いじします。 かくacquire()は、パーミットが利用りよう可能かのうになるまで必要ひつようおうじてブロックし、そのパーミットを取得しゅとくします。 かくrelease()はパーミットを追加ついかし、場合ばあいによってはブロックしている取得しゅとくがわ解放かいほうします。 ただし、実際じっさいのパーミット・オブジェクトは使用しようされません。Semaphoreたん利用りよう可能かのう個数こすうのカウントを保持ほじし、それにおうじた処理しょりおこないます。

    セマフォは、物理ぶつりてきまたは論理ろんりてき一部いちぶのリソースにアクセス可能かのうなスレッドすう制限せいげんするためによく使用しようされます。 たとえば、つぎのクラスでは、セマフォを使用しようして項目こうもくのプールへのアクセスを制御せいぎょします。

     
     class Pool {
       private static final int MAX_AVAILABLE = 100;
       private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
    
       public Object getItem() throws InterruptedException {
         available.acquire();
         return getNextAvailableItem();
       }
    
       public void putItem(Object x) {
         if (markAsUnused(x))
           available.release();
       }
    
       // Not a particularly efficient data structure; just for demo
    
       protected Object[] items = ... whatever kinds of items being managed
       protected boolean[] used = new boolean[MAX_AVAILABLE];
    
       protected synchronized Object getNextAvailableItem() {
         for (int i = 0; i < MAX_AVAILABLE; ++i) {
           if (!used[i]) {
             used[i] = true;
             return items[i];
           }
         }
         return null; // not reached
       }
    
       protected synchronized boolean markAsUnused(Object item) {
         for (int i = 0; i < MAX_AVAILABLE; ++i) {
           if (item == items[i]) {
             if (used[i]) {
               used[i] = false;
               return true;
             } else
               return false;
           }
         }
         return false;
       }
     }

    項目こうもく取得しゅとくするまえに、かくスレッドはセマフォから、項目こうもく利用りよう可能かのうであることを保証ほしょうするパーミットを取得しゅとくする必要ひつようがあります。 項目こうもく処理しょり完了かんりょうするとスレッドはプールにもどり、パーミットがセマフォにかえされ、ほかのスレッドがその項目こうもく取得しゅとくできるようになります。 acquire()されたとき、同期どうきロックは保持ほじされないことに注意ちゅういしてください。同期どうきロックが保持ほじされると、項目こうもくがプールにかえされなくなるためです。 セマフォは、プールへのアクセスを制限せいげんする必要ひつようのある同期どうきを、プール自体じたい一貫いっかんせい維持いじするために必要ひつよう同期どうきからは分離ぶんりしてカプセルします。

    を1に初期しょきされたセマフォは、利用りようできるパーミットが最大さいだい1個いっこであるセマフォとして使用しようされるため、相互そうご排他はいたロックとして利用りようできます。 これは一般いっぱんてきには2しんがたセマフォばれます。利用りよう可能かのうなパーミットが1つか、または利用りよう可能かのうなパーミットがないかの2つの状態じょうたいしかないためです。 このように使用しようされた場合ばあいおおくのLock実装じっそうとはことなり、2しんがたセマフォには、所有しょゆうしゃ以外いがいのスレッドでロックを解放かいほうできるという特性とくせいがあります(セマフォには所有しょゆうけん概念がいねんがないため)。 これは、デッドロックの回復かいふくのような特殊とくしゅなコンテキストで便利べんりです。

    このクラスのコンストラクタは、オプションで公平こうへいせいパラメータをれます。 falseに設定せっていすると、このクラスはスレッドがパーミットを取得しゅとくする順序じゅんじょについて保証ほしょうしません。 とくに、バージ(barging)が許可きょかされています。つまり、acquire()すスレッドに、待機たいきしていたスレッドよりさきにパーミットをてることができます。論理ろんりてきには、あたらしいスレッドが、待機たいきちゅうのスレッドのキューの先頭せんとう配置はいちされます。 公平こうへいせいがtrueに設定せっていされると、セマフォは、acquireメソッドのいずれかをすスレッドが、これらのメソッドの呼出よびだしが処理しょりされた順序じゅんじょ(先入さきい先出さきだし、FIFO)でパーミットを取得しゅとくするように選択せんたくされることを保証ほしょうします。 FIFO順序じゅんじょけは、必然ひつぜんてきにこれらのメソッドない特定とくてい内部ないぶ実行じっこうポイントに適用てきようされます。 そのため、あるスレッドがべつのスレッドよりまえacquireしても、そのスレッドよりあとに順序付じゅんじょづけポイントに到達とうたつする可能かのうせいがあります。また、メソッドからの復帰ふっき同様どうようです。 また、時間じかん指定していのないtryAcquireメソッドは公平こうへいせい設定せっていしたがいませんが、利用りよう可能かのうなパーミットをすべて取得しゅとくすることにも注意ちゅういしてください。

    通常つうじょう、リソース・アクセスを制御せいぎょするために使用しようされるセマフォは、リソースへのアクセスができないスレッドがないよう、公平こうへい初期しょきされる必要ひつようがあります。 ほかの種類しゅるい同期どうき制御せいぎょにセマフォを使用しようする場合ばあいは、公平こうへいせい考慮こうりょするよりも不公平ふこうへい順序じゅんじょけによるスループットの利点りてんのほうがしばしば重要じゅうようになります。

    このクラスはまた、複数ふくすうのパーミットにたいして同時どうじacquirerelease実行じっこうするための簡易かんいメソッドも提供ていきょうします。 これらのメソッドは一般いっぱんに、ループより効率こうりつてきかつ効果こうかてきである。 ただし、優先ゆうせん順位じゅんい設定せっていされません。 たとえば、スレッドAがs.acquire(3し、スレッドBがs.acquire(2)し、2つの許可きょか利用りよう可能かのうになると、その獲得かくとく最初さいしょおこなわれ、Semaphore sがフェア・モードでないかぎり、スレッドBがそれらを取得しゅとくする保証ほしょうはありません。

    メモリー整合せいごうせい効果こうか: release()などの「解放かいほう」メソッドをまえのスレッドないのアクションは、べつのスレッドないacquire()などの正常せいじょう終了しゅうりょうした「取得しゅとく」メソッドにつづくアクションのまえ発生はっせいします。

    導入どうにゅうされたバージョン:
    1.5
    関連かんれん項目こうもく:
    直列ちょくれつされた形式けいしき
    • コンストラクタのサマリー

      コンストラクタ 
      コンストラクタ 説明せつめい
      Semaphore​(int permits)
      指定していされたかずのパーミットと不公平ふこうへい公平こうへいせい設定せってい使用しようして、Semaphore作成さくせいします。
      Semaphore​(int permits, boolean fair)
      指定していされたかずのパーミットと指定していされた公平こうへいせい設定せってい使用しようして、Semaphore作成さくせいします。
    • メソッドのサマリー

      すべてのメソッド インスタンス・メソッド 具象ぐしょうメソッド 
      修飾しゅうしょくかた メソッド 説明せつめい
      void acquire​()
      このセマフォからパーミットを取得しゅとくします。パーミットが利用りよう可能かのうになるか、またはスレッドがされるまでブロックします。
      void acquire​(int permits)
      このセマフォから指定していされたかずのパーミットを取得しゅとくします。すべてのパーミットが利用りよう可能かのうになるか、またはスレッドがされるまでブロックします。
      void acquireUninterruptibly​()
      このセマフォからパーミットを取得しゅとくします。パーミットが利用りよう可能かのうになるまでブロックします。
      void acquireUninterruptibly​(int permits)
      このセマフォから指定していされたかずのパーミットを取得しゅとくします。すべてのパーミットが利用りよう可能かのうになるまでブロックします。
      int availablePermits​()
      このセマフォで現在げんざい利用りよう可能かのうなパーミットのかずかえします。
      int drainPermits​()
      すぐに利用りよう可能かのうなすべての許可きょか取得しゅとくしてかえします。または、否定ひていてき許可きょか利用りよう可能かのう場合ばあいは、それらを解放かいほうします。
      protected Collection<Thread> getQueuedThreads​()
      パーミットの取得しゅとく待機たいきしているスレッドをふくむコレクションをかえします。
      int getQueueLength​()
      パーミットの取得しゅとく待機たいきしているスレッドの推定すいていすうかえします。
      boolean hasQueuedThreads​()
      パーミットの取得しゅとく待機たいきちゅうのスレッドが存在そんざいするかどうかを照会しょうかいします。
      boolean isFair​()
      このセマフォで公平こうへいせいがtrueに設定せっていされている場合ばあいtrueかえします。
      protected void reducePermits​(int reduction)
      指定していされたreductionのかずだけ利用りよう可能かのうなパーミットのかずらします。
      void release​()
      パーミットを解放かいほうし、セマフォにもどします。
      void release​(int permits)
      指定していされたかずのパーミットを解放かいほうし、セマフォにもどします。
      String toString​()
      セマフォおよびその状態じょうたい識別しきべつする文字もじれつかえします。
      boolean tryAcquire​()
      パーミットが呼出よびだ利用りよう可能かのう場合ばあいかぎり、このセマフォからパーミットを取得しゅとくします。
      boolean tryAcquire​(int permits)
      指定していされたかずのパーミットが呼出よびだ利用りよう可能かのう場合ばあいかぎり、それらすべてのパーミットを取得しゅとくします。
      boolean tryAcquire​(int permits, long timeout, TimeUnit unit)
      指定していされた待機たいき時間じかんない指定していされたかずのパーミットが利用りよう可能かのうであり、現在げんざいのスレッドで発生はっせいしていない場合ばあいに、このセマフォから指定していされたかずのパーミットを取得しゅとくします。
      boolean tryAcquire​(long timeout, TimeUnit unit)
      指定していされた待機たいき時間じかんないでパーミットが利用りよう可能かのうになり、現在げんざいのスレッドで発生はっせいしていない場合ばあいに、このセマフォからパーミットを取得しゅとくします。
    • コンストラクタの詳細しょうさい

      • Semaphore

        public Semaphore​(int permits)
        指定していされたかずのパーミットと不公平ふこうへい公平こうへいせい設定せってい使用しようして、Semaphore作成さくせいします。
        パラメータ:
        permits - 利用りよう可能かのうなパーミットの初期しょきかず このまけにすることも可能かのうで、その場合ばあい取得しゅとくメソッドが許可きょかまえ解放かいほう発生はっせいする必要ひつようがある。
      • Semaphore

        public Semaphore​(int permits,
                         boolean fair)
        指定していされたかずのパーミットと指定していされた公平こうへいせい設定せってい使用しようして、Semaphore作成さくせいします。
        パラメータ:
        permits - 利用りよう可能かのうなパーミットの初期しょきかず このまけにすることも可能かのうで、その場合ばあい取得しゅとくメソッドが許可きょかまえ解放かいほう発生はっせいする必要ひつようがある。
        fair - このセマフォが競合きょうごうにパーミットの許可きょか先入さきい先出さきだしで保証ほしょうする場合ばあいtrue。それ以外いがい場合ばあいfalse
    • メソッドの詳細しょうさい

      • acquire

        public void acquire​()
                     throws InterruptedException
        このセマフォからパーミットを取得しゅとくします。パーミットが利用りよう可能かのうになるか、またはスレッドがされるまでブロックします。

        パーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてすぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかずは1つずつります。

        パーミットが利用りよう可能かのうでない場合ばあい現在げんざいのスレッドはスレッドのスケジューリングにかんして無効むこうになり、つぎの2つのいずれかがきるまで待機たいきします。

        • ほかのスレッドがこのセマフォにたいしてrelease()メソッドをし、現在げんざいのスレッドがつぎにパーミットをてられるスレッドになる。
        • ほかのスレッドが現在げんざいのスレッドにおこなう。

        現在げんざいのスレッドで、

        • このメソッドへのエントリじょう設定せっていされた割込わりこみステータスが保持ほじされるか、
        • パーミットの待機たいきちゅう発生はっせいした場合ばあい
        InterruptedExceptionがスローされ、現在げんざいのスレッドの割込わりこみステータスがクリアされます。
        例外れいがい:
        InterruptedException - 現在げんざいのスレッドで割込わりこみが発生はっせいした場合ばあい
      • acquireUninterruptibly

        public void acquireUninterruptibly​()
        このセマフォからパーミットを取得しゅとくします。パーミットが利用りよう可能かのうになるまでブロックします。

        パーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてすぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかずは1つずつります。

        パーミットが使用しようできない場合ばあい現在げんざいのスレッドはスレッドのスケジューリングの目的もくてきたいして無効むこうになり、ほかのいずれかのスレッドがこのセマフォのrelease()メソッドをして、現在げんざいのスレッドがつぎにパーミットをてられるスレッドになるまで、現在げんざいのスレッドは待機たいきします。

        パーミットの待機たいきちゅう現在げんざいのスレッドがされると、待機たいき続行ぞっこうしますが、スレッドにパーミットがてられるタイミングは、割込わりこみが発生はっせいしなかった場合ばあいにパーミットをるはずのタイミングとはことなることがあります。 スレッドがこのメソッドから復帰ふっきすると、その割込わりこ状態じょうたい設定せっていされます。

      • tryAcquire

        public boolean tryAcquire​()
        パーミットが呼出よびだ利用りよう可能かのう場合ばあいかぎり、このセマフォからパーミットを取得しゅとくします。

        パーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてtrueですぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかずは1つずつります。

        パーミットが利用りよう可能かのうでない場合ばあい、このメソッドはfalseですぐに復帰ふっきします。

        このセマフォが公平こうへい順序付じゅんじょづけポリシーを使用しようするように設定せっていされている場合ばあいでも、パーミットが利用りよう可能かのうであれば、ほかのスレッドが現在げんざい待機たいきしているかどうかに関係かんけいなく、tryAcquire()呼出よびだしですぐにパーミットを取得しゅとくします この「バージ」(barging)動作どうさにより公平こうへいせいうしなわれるとはえ、これは特定とくてい状況じょうきょう有用ゆうようです。 公平こうへいせい設定せってい尊重そんちょうする場合ばあいは、ほぼ等価とうかtryAcquire(0, TimeUnit.SECONDS) 使用しようします(これも割込わりこみを検出けんしゅつする)。

        もど:
        パーミットが取得しゅとくされた場合ばあいtrue。それ以外いがい場合ばあいfalse
      • tryAcquire

        public boolean tryAcquire​(long timeout,
                                  TimeUnit unit)
                           throws InterruptedException
        指定していされた待機たいき時間じかんないでパーミットが利用りよう可能かのうになり、現在げんざいのスレッドで発生はっせいしていない場合ばあいに、このセマフォからパーミットを取得しゅとくします。

        パーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてtrueですぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかずは1つずつります。

        パーミットが利用りよう可能かのうでない場合ばあい現在げんざいのスレッドはスレッドのスケジューリングにかんして無効むこうになり、つぎの3つのいずれかがきるまで待機たいきします。

        • ほかのスレッドがこのセマフォにたいしてrelease()メソッドをし、現在げんざいのスレッドがつぎにパーミットをてられるスレッドになる。
        • ほかのスレッドが現在げんざいのスレッドにおこなう。または
        • 指定していされた待機たいき時間じかん経過けいかする。

        パーミットが取得しゅとくされた場合ばあいは、trueかえされます。

        現在げんざいのスレッドで、

        • このメソッドへのエントリじょう設定せっていされた割込わりこみステータスが保持ほじされるか、
        • パーミットの取得しゅとく待機たいきちゅう発生はっせいした場合ばあい
        InterruptedExceptionがスローされ、現在げんざいのスレッドの割込わりこみステータスがクリアされます。

        指定していされた待機たいき時間じかん経過けいかすると、falseかえされます。 時間じかんがゼロまたはそれよりちいさい場合ばあい、メソッドは待機たいきしません。

        パラメータ:
        timeout - パーミットの最長さいちょう待機たいき時間じかん
        unit - timeout引数ひきすう時間じかん単位たんい
        もど:
        パーミットが取得しゅとくされた場合ばあいtrue。パーミットが取得しゅとくされるまえ待機たいき時間じかん経過けいかした場合ばあいfalse
        例外れいがい:
        InterruptedException - 現在げんざいのスレッドで割込わりこみが発生はっせいした場合ばあい
      • release

        public void release​()
        パーミットを解放かいほうし、セマフォにもどします。

        パーミットを解放かいほうすると、利用りよう可能かのうなパーミットのかずが1つずつえます。 いくつかのスレッドがパーミットを取得しゅとくしようとこころみている場合ばあいは、そのなかの1つのスレッドが選択せんたくされ、解放かいほうされたばかりのパーミットがあたえられます。 そのスレッドは、スレッドのスケジューリングにかんして(ふたたび)有効ゆうこうになります。

        パーミットを解放かいほうするスレッドは、acquire()呼出よびだしでそのパーミットを取得しゅとくしている必要ひつようはありません。 セマフォの適切てきせつ使用しようほうは、アプリケーションでのプログラミング規約きやく確立かくりつされます。

      • acquire

        public void acquire​(int permits)
                     throws InterruptedException
        このセマフォから指定していされたかずのパーミットを取得しゅとくします。すべてのパーミットが利用りよう可能かのうになるか、またはスレッドがされるまでブロックします。

        指定していされたかずのパーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてすぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかず指定していされたかずずつります。 このメソッドは、ループをfor (int i = 0; i < permits; ++i) acquire();おな効果こうかがありますが、パーツを原子げんしてきにまとめて取得しゅとくするてんことなります:

        十分じゅうぶんかずのパーミットが利用りよう可能かのうでない場合ばあい現在げんざいのスレッドはスレッドのスケジューリングにかんして無効むこうになり、つぎの2つのいずれかがきるまで待機たいきします。

        • のスレッドはこのセマフォのreleaseメソッドの1つをし、現在げんざいのスレッドはつぎ許可きょかてられ、使用しよう可能かのう許可きょかかずがこのリクエストをたします。または
        • ほかのスレッドが現在げんざいのスレッドにおこなう。

        現在げんざいのスレッドで、

        • このメソッドへのエントリじょう設定せっていされた割込わりこみステータスが保持ほじされるか、
        • パーミットの待機たいきちゅう発生はっせいした場合ばあい
        InterruptedExceptionがスローされ、現在げんざいのスレッドの割込わりこみステータスがクリアされます。 このスレッドにてられるはずだったすべてのパーミットは、release()呼出よびだしでパーミットが利用りよう可能かのうになったかのように、パーミットの取得しゅとくこころみるべつのスレッドにてられます。
        パラメータ:
        permits - 取得しゅとくするパーミットのかず
        例外れいがい:
        InterruptedException - 現在げんざいのスレッドで割込わりこみが発生はっせいした場合ばあい
        IllegalArgumentException - permitsまけである場合ばあい
      • acquireUninterruptibly

        public void acquireUninterruptibly​(int permits)
        このセマフォから指定していされたかずのパーミットを取得しゅとくします。すべてのパーミットが利用りよう可能かのうになるまでブロックします。

        指定していされたかずのパーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてすぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかず指定していされたかずずつります。 このメソッドは、ループをfor (int i = 0; i < permits; ++i) acquireUninterruptibly();おな効果こうかがありますが、パーツを原子げんしてきにまとめて取得しゅとくするてんことなります:

        不十分ふじゅうぶん許可きょか利用りよう可能かのう場合ばあい現在げんざいのスレッドはスレッド・スケジューリングの目的もくてき無効むこうになり、のスレッドがこのセマフォのreleaseメソッドの1つをし、現在げんざいのスレッドがつぎ許可きょかてられ、利用りよう可能かのう許可きょかかずがこのリクエストをたすまで。

        現在げんざいのスレッドがパーミットの待機たいきちゅうまれ場合ばあい待機たいき続行ぞっこうします。キューないでの現在げんざいのスレッドの位置いちには影響えいきょうありません。 スレッドがこのメソッドから復帰ふっきすると、その割込わりこ状態じょうたい設定せっていされます。

        パラメータ:
        permits - 取得しゅとくするパーミットのかず
        例外れいがい:
        IllegalArgumentException - permitsまけである場合ばあい
      • tryAcquire

        public boolean tryAcquire​(int permits)
        指定していされたかずのパーミットが呼出よびだ利用りよう可能かのう場合ばあいかぎり、それらすべてのパーミットを取得しゅとくします。

        指定していされたかずのパーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてtrueですぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかず指定していされたかずずつります。

        十分じゅうぶんかずのパーミットが利用りよう可能かのうでない場合ばあい、このメソッドはfalseですぐに復帰ふっきし、利用りよう可能かのうなパーミットのかず変化へんかしません。

        このセマフォが公平こうへい順序付じゅんじょづけポリシーを使用しようするように設定せっていされている場合ばあいでも、パーミットが利用りよう可能かのうであれば、ほかのスレッドが現在げんざい待機たいきしているかどうかに関係かんけいなく、tryAcquire呼出よびだしですぐにパーミットを取得しゅとくします この「バージ」(barging)動作どうさにより公平こうへいせいうしなわれるとはえ、これは特定とくてい状況じょうきょう有用ゆうようです。 公平こうへいせい設定せってい尊重そんちょうする場合ばあいは、ほぼ等価とうかtryAcquire(permits, 0, TimeUnit.SECONDS) 使用しようします(これも割込わりこみを検出けんしゅつする)。

        パラメータ:
        permits - 取得しゅとくするパーミットのかず
        もど:
        パーミットが取得しゅとくされた場合ばあいtrue。それ以外いがい場合ばあいfalse
        例外れいがい:
        IllegalArgumentException - permitsまけである場合ばあい
      • tryAcquire

        public boolean tryAcquire​(int permits,
                                  long timeout,
                                  TimeUnit unit)
                           throws InterruptedException
        指定していされた待機たいき時間じかんない指定していされたかずのパーミットが利用りよう可能かのうであり、現在げんざいのスレッドで発生はっせいしていない場合ばあいに、このセマフォから指定していされたかずのパーミットを取得しゅとくします。

        指定していされたかずのパーミットが利用りよう可能かのう場合ばあいはパーミットを取得しゅとくしてtrueですぐに復帰ふっきするため、利用りよう可能かのうなパーミットのかず指定していされたかずずつります。

        十分じゅうぶんかずのパーミットが利用りよう可能かのうでない場合ばあい現在げんざいのスレッドはスレッドのスケジューリングにかんして無効むこうになり、つぎの3つのいずれかがきるまで待機たいきします。

        • のスレッドはこのセマフォのreleaseメソッドの1つをし、現在げんざいのスレッドはつぎ許可きょかてられ、使用しよう可能かのう許可きょかかずがこのリクエストをたします。または
        • ほかのスレッドが現在げんざいのスレッドにおこなう。または
        • 指定していされた待機たいき時間じかん経過けいかする。

        パーミットが取得しゅとくされた場合ばあいは、trueかえされます。

        現在げんざいのスレッドで、

        • このメソッドへのエントリじょう設定せっていされた割込わりこみステータスが保持ほじされるか、
        • パーミットの取得しゅとく待機たいきちゅう発生はっせいした場合ばあい
        InterruptedExceptionがスローされ、現在げんざいのスレッドの割込わりこみステータスがクリアされます。 このスレッドにてられるはずだったすべてのパーミットは、release()呼出よびだしでパーミットが利用りよう可能かのうになったかのように、パーミットの取得しゅとくこころみるべつのスレッドにてられます。

        指定していされた待機たいき時間じかん経過けいかすると、falseかえされます。 時間じかんがゼロまたはそれよりちいさい場合ばあい、メソッドは待機たいきしません。 このスレッドにてられるはずだったすべてのパーミットは、release()呼出よびだしでパーミットが利用りよう可能かのうになったかのように、パーミットの取得しゅとくこころみるべつのスレッドにてられます。

        パラメータ:
        permits - 取得しゅとくするパーミットのかず
        timeout - パーミットの最長さいちょう待機たいき時間じかん
        unit - timeout引数ひきすう時間じかん単位たんい
        もど:
        すべてのパーミットが取得しゅとくされた場合ばあいtrue。すべてのパーミットが取得しゅとくされるまえ待機たいき時間じかん経過けいかした場合ばあいfalse
        例外れいがい:
        InterruptedException - 現在げんざいのスレッドで割込わりこみが発生はっせいした場合ばあい
        IllegalArgumentException - permitsまけである場合ばあい
      • release

        public void release​(int permits)
        指定していされたかずのパーミットを解放かいほうし、セマフォにもどします。

        指定していされたかずのパーミットを解放かいほうすると、利用りよう可能かのうなパーミットのかずがそのぶんえます。 許可きょか取得しゅとくしようとしているスレッドがあれば、1つのスレッドが選択せんたくされ、こんリリースされた許可きょかあたえられます。 利用りよう可能かのうなパーミットのかずがそのスレッドの要求ようきゅうたす場合ばあい、そのスレッドはスレッドのスケジューリングにかんして(ふたたび)有効ゆうこうになります。そうでない場合ばあい十分じゅうぶんなパーミットが利用りよう可能かのうになるまでスレッドは待機たいきします。 このスレッドの要求ようきゅうたしたあともつづきパーミットが利用りよう可能かのう場合ばあい、それらのパーミットはパーミットを取得しゅとくしようとしているべつのスレッドにてられます。

        パーミットを解放かいほうするスレッドは、acquire呼出よびだしでそのパーミットを取得しゅとくしている必要ひつようはありません。 セマフォの適切てきせつ使用しようほうは、アプリケーションでのプログラミング規約きやく確立かくりつされます。

        パラメータ:
        permits - 解放かいほうするパーミットのかず
        例外れいがい:
        IllegalArgumentException - permitsまけである場合ばあい
      • availablePermits

        public int availablePermits​()
        このセマフォで現在げんざい利用りよう可能かのうなパーミットのかずかえします。

        通常つうじょう、このメソッドはデバッグとテストの場合ばあい使用しようします。

        もど:
        このセマフォで利用りよう可能かのうなパーミットのかず
      • drainPermits

        public int drainPermits​()
        すぐに利用りよう可能かのうなすべての許可きょか取得しゅとくしてかえします。または、否定ひていてき許可きょか利用りよう可能かのう場合ばあいは、それらを解放かいほうします。 返却へんきゃくには、ゼロ許可きょか利用りよう可能かのうです。
        もど:
        取得しゅとくされた許可きょかかず、または、もしあれば、リリースされたかず
      • reducePermits

        protected void reducePermits​(int reduction)
        指定していされたreductionのかずだけ利用りよう可能かのうなパーミットのかずらします。 このメソッドは、利用りよう不可能ふかのうになるリソースを追跡ついせきするためにセマフォを使用しようするサブクラスで有用ゆうようです。 パーミットが利用りよう可能かのうになるまでブロックして待機たいきしないてんで、このメソッドはacquireことなります。
        パラメータ:
        reduction - 削除さくじょするパーミットのかず
        例外れいがい:
        IllegalArgumentException - reductionまけである場合ばあい
      • isFair

        public boolean isFair​()
        このセマフォで公平こうへいせいがtrueに設定せっていされている場合ばあいtrueかえします。
        もど:
        このセマフォで公平こうへいせいがtrueに設定せっていされている場合ばあいtrue
      • hasQueuedThreads

        public final boolean hasQueuedThreads​()
        パーミットの取得しゅとく待機たいきちゅうのスレッドが存在そんざいするかどうかを照会しょうかいします。 取消とりけしはいつでも発生はっせいする可能かのうせいがあるため、trueかえされても、ほかのいずれかのスレッドが取得しゅとくするとは保証ほしょうされていないことに注意ちゅういしてください。 このメソッドは、おもにシステム状態じょうたい監視かんし使用しようする目的もくてき設計せっけいされています。
        もど:
        ロックの取得しゅとく待機たいきちゅうのほかのスレッドが存在そんざいする可能かのうせいがある場合ばあいtrue
      • getQueueLength

        public final int getQueueLength​()
        パーミットの取得しゅとく待機たいきしているスレッドの推定すいていすうかえします。 このメソッドが内部ないぶのデータ構造こうぞうをトラバースしているあいだにも、スレッドすう動的どうてき変化へんかする場合ばあいがあるため、この推定すいていぎません。 このメソッドは、同期どうき制御せいぎょようとしてではなく、システム状態じょうたい監視かんしようとして設計せっけいされています。
        もど:
        このロックを待機たいきしているスレッドの推定すいていすう
      • getQueuedThreads

        protected Collection<Thread> getQueuedThreads​()
        パーミットの取得しゅとく待機たいきしているスレッドをふくむコレクションをかえします。 実際じっさいのスレッド・セットは、結果けっか構築こうちくちゅうにも動的どうてき変化へんかする可能かのうせいがあるため、かえされるコレクションは最善さいぜん努力どりょくはらったうえでの推定すいていぎません。 かえされるコレクションの要素ようそには、特定とくてい順序じゅんじょ存在そんざいしません。 このメソッドは、より包括ほうかつてき監視かんし機能きのう提供ていきょうするサブクラスの構築こうちく容易よういにする目的もくてき設計せっけいされています。
        もど:
        スレッドのコレクション
      • toString

        public String toString​()
        セマフォおよびその状態じょうたい識別しきべつする文字もじれつかえします。 状態じょうたい括弧かっこかこまれ、文字もじれつ"Permits ="つづいてパーミットのかずふくまれます。
        オーバーライド:
        toString、クラス: Object
        もど:
        このセマフォおよびその状態じょうたい識別しきべつする文字もじれつ