セマフォは、主に同時コード実行を制御するツールクラスの数を制限し、許可を通じて同時実行の数を内部的に定義するために使用されます。
/** *非フェアバージョンコンポーネントセマフォを使用 */public ksemaphore(int permits){sync = new non-fairsync(permits);}/** *バージョンコンポーネントセマフォ */public ksemaphore(int permits、boolean fair){sync = fair? new FairSync(許可):new nonfairsync(許可);} /** aqsサブクラスメイン定義リリースロックを取得*/抽象的なstaticクラス同期kabstractqueuedsynchronizer {private static final long serialversionuid = 119245721009191910933l; / ** *許可を指定しますSemaphoreを初期化 */ sync(int Permits){setState(permits); } / ** *残りの許可を返します * / final int getPermits(){return getState(); } / ** *許可を取得 * / final int non -fairtryacquireshared(int quickires){for(;;){int available = getState(); int rething =利用可能 - 取得; //取得を取得するために残りの許可の数を決定する場合(残り<0 ||比較(restive)){// cas変更状態戻りの残り; }}}}} / ** *リリースlock * /保護された最終的なブールアレントリレリーズシェア(int leleases){for(;;){int current = getState(); int next = current + lileases; if(next <current){//オーバーフロー新しいエラー( "最大許可カウントを超えた"); } if(compareandsetState(current、next)){// cas change state return true; }}} final void reductionpermits(int reductions){//(;;){int current = getState(); int next = current -reductions; if(next> current){// underflowスローNew Error( "Permit Count Underflow"); } if(compareandsetState(current、next)){return; }}}} / ** 0* / final int drainPermits(){for(;;){int current = getState(); if(current == 0 || compareandsetState(current、0)){return current; }}}} /*** ackiiresharedIntractiblyを呼び出して、割り込みに応じて許可を取得します*/public void acchire()throws interruptedexception {sync.acquireshared-unterrumdibly(1);}/*** acchireundructiblyでコールして、非応答性割り込みで許可を取得します*/public vaod unindertibly() */public boolean tryacquire(){return sync.nonfairtryacquireshared(1)> = 0;}/***プレスを取得し、タイムアウトと割り込みをサポートしようとします*/パブリックブールトリックア(ロングタイムアウト、タイムニットユニット)スローが中断されます許可 */public void actovier(int permintes)shows arturtedexception {if(permits <0){show new ullegalargumentexception(); } sync.acquireshared internctibly(ablities);}/** *割り込みに応答しない許可を取得 */public void acchireun -distractibly(int permits){if(permits <0)show new lilegalargumentexception(); sync.acquireshared(許可);}/** *許可を取得してみてください */public boolean tryacquire(int permits){if(permits <0)show new Illegalargumentexception(); return sync.nonfairtryacquireshared(許可)> = 0;}/** *タイムアウトメカニズムをサポートしようとします。 return sync.tryacquiresharednanos(permits、unit.tonanos(Timout));} /** *リリース許可 */public void release(){sync.releaseshared(1);}/** *リリース許可 */public void release(int permits){if(permits <0)throw new Illegalargumentexception(); sync.releaseshared(許可);} /** * return availaind complit */public int vayaverPermits(){return sync.getPermits();}/** *消費許可 */public int Drainpermits(){return sync.drainpermits();}/** *削減許可 *を削減 */保護されたvoid readypermits(int){reduction <0)show <0); sync.ReducePermits(削減);}/***それが公正なバージョンであるかどうかを判断しますin aqs*/public final int getqueuelength(){return sync.getqueuelength();}/***aqs*/protected collection <shood> getqueuethreads(){return sync.getqueuedthreads();上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。