0

セマフォカウンターとセマフォメソッドの正式なパラメーターと混同してしまいました

acquire(int parameter), acquireUninterptbly(int parameter), release(int parameter).

パラメータがセマフォ カウンタより大きい場合、またはその逆の場合はどうなりますか。
誰かがリアルタイムの例を挙げて説明してくれると非常に役に立ちます。

4

1 に答える 1

2

ASemaphoreには、利用可能な一定数の許可があります。がacquire(int permits)呼び出されると、指定された数の許可がセマフォから取得されます。セマフォに十分なパーミットがない場合、メソッドは、十分なパーミットが利用可能になるまで呼び出しスレッドをブロック/中断します。

セマフォで が呼び出された場合release(int permits)、指定された数の許可がセマフォに返されます。スレッドがパーミットを待機している場合 (acquire呼び出しがブロックされているため)、スレッドは起動され、要求された数のパーミットを取得しようとします。

(内部的には、パーミットはスレッドセーフな数値カウンターに他ならず、減少または増加し、決して負になることはありません)。

通常、aquire(int)は割り込み可能であるため、t待機中のスレッドは、別のスレッドからaquire(int)呼び出すことで割り込むことができます。t.interrupt()この場合、ブロッキングaquireコールはInterruptedException. acquireメソッドの代わりにaquireUninterruptibly使用されている場合、これは機能しません。

例として、JavaDoc を見てください: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

パーミットの最大数に関する 1 つのこと: セマフォは、使用可能な特定の数のパーミットで初期化されますが、これがセマフォが持てるパーミットの最大数であるという意味ではありません。理論的には、スレッドは、取得したよりも多くの許可を解放できます (または、最初に呼び出さずに許可を解放することさえできacquireます)。そのためaquire(int)、セマフォが初期化されたときよりも多くの許可を使用して呼び出すrelease(int)ことができ、セマフォがこれまでに持っていたよりも多くの許可を返すことを呼び出すことができます。そのような呼び出しのセマンティクスはプログラマ次第です...

于 2013-09-25T06:23:52.250 に答える