leeps

leeps

信号量セマフォ

java.util.concurrent.Semaphore クラスは、カウントセマフォです。これは、2 つの主要なメソッドを持っていることを意味します:

acquire()
release()

カウントセマフォは、指定された数の「許可」で初期化されます。acquire () を呼び出すたびに、呼び出し元のスレッドが 1 つの許可を取得します。release () を呼び出すたびに、1 つの許可がセマフォに返されます。したがって、release () を呼び出さない場合、acquire () メソッドを通過できるスレッドは、セマフォの初期化時に指定された許可の数(N)までです。これらの許可は単なるカウンターです。特に特別なことはありません。

Semaphore の使用法#

セマフォには主に 2 つの用途があります:

  1. 重要な(コード)セクションにおいて、N 個を超えるスレッドの同時進入を防ぐこと。
  2. 2 つのスレッド間で信号を送信すること。

重要なセクションの保護#

セマフォを重要なセクションの保護に使用する場合、このセクションに入ろうとするコードは通常、まず許可を取得し、その後に重要なセクション(コードブロック)に入ることができます。実行が完了したら、許可を解放します。例えば、以下のようになります:

Semaphore semaphore = new Semaphore(1);  
  
//critical section  
semaphore.acquire();  
  
...  
  
semaphore.release();

スレッド間での信号の送信#

2 つのスレッド間で信号を送信するためにセマフォを使用する場合、通常は 1 つのスレッドが acquire () メソッドを呼び出し、もう 1 つのスレッドが release () メソッドを呼び出します。
利用可能な許可がない場合、acquire () 呼び出しは許可が別のスレッドによって解放されるまでブロックされます。同様に、さらに許可を解放することができない場合、release () 呼び出しもブロックされます。
これにより、複数のスレッドを調整することができます。たとえば、スレッド 1 がオブジェクトを共有リストに挿入した後に acquire () を呼び出し、スレッド 2 がそのリストからオブジェクトを取得する前に release () を呼び出すと、ブロッキングキューが作成されます。セマフォの利用可能な許可の数は、このブロッキングキューが保持できる要素の数と同じです。

フェアネス#

スレッドがセマフォから許可を公平に取得することを保証する方法はありません。つまり、最初に acquire () を呼び出すスレッドが最初に許可を取得するスレッドであることを保証することはできません。最初のスレッドが許可を待ってブロックされている間に、2 番目のスレッドが許可を要求するタイミングで許可が解放されると、2 番目のスレッドが最初のスレッドよりも先に許可を取得する可能性があります。
フェアネスを強制するには、Semaphore クラスにはブール型のパラメータを持つコンストラクタがあります。このパラメータを使用して、Semaphore にフェアネスを強制するかどうかを指定します。フェアネスを強制すると、並行性のパフォーマンスに影響を与えるため、必要な場合以外は有効にしないでください。
以下は、フェアモードで Semaphore を作成する方法の例です:

Semaphore semaphore = new Semaphore(1, true);

その他のメソッド#

java.util.concurrent.Semaphore クラスには、次のような他のメソッドもあります:

  1. availablePermits()
  2. acquireUninterruptibly()
  3. drainPermits()
  4. hasQueuedThreads()
  5. getQueuedThreads()
  6. tryAcquire()

など

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。