O semáforo é usado principalmente para limitar o número de classes de ferramentas que controlam a execução simultânea do código e define internamente o número de execuções simultâneas por meio de uma permissão.
/** * Use componente de versão não-fair SemaPhore */public ksemaphore (int permissões) {sync = new nonfairSync (Permissões);}/** * especifique o componente da versão semáforo */public ksemaphore (int permiss, feira booleana) {sync = feira? New FairSync (Permissões): New Non -FairSync (Permissões);} /** Subclasse AQS Definição principal Obtenha Lank de liberação*/Classe estática abstrata Sincroniza estende KabstractQueedSynchronizer {private estático final serialversionuid = 1192457210091910933L; / ** * Especifique a permissão inicialize semáforo */ sincronização (int permits) {setState (permissões); } / ** * Retorne a permissão restante * / final int getPerMits () {return getState (); } / ** * Obtenha permissão * / final int não -FairtryAcquiredariações (int adquire) {for (;;) {int disponível = getState (); Int restante = disponível - adquire; // Determine o número de licenças restantes para obter adquire se (permanecendo <0 || comparanstetState (disponível, restante)) {// Cas Change State Return Return; }}}} / ** * Libere o bloqueio * / Protectado Boolean TryReLeashared (INT Lobes) {for (;;) {int current = getState (); int próximo = corrente + liberações; if (a seguir <current) {// Overflow Throw New Error ("contagem máxima da licença excedida"); } if (comparaandStState (atual, próximo)) {// Cas Change State Return true; }}} Void final ReduCerMits (Int Reduções) {// Reduza as licenças para (;;) {int current = getState (); int próximo = atual - reduções; if (a seguir> atual) {// subfluxo de lança um novo erro ("permitir a contagem de subflow"); } if (ComparaDSetState (atual, próximo)) {return; }}}} / ** Defina a licença para 0* / final int drenperMits () {for (;;) {int current = getState (); if (atual == 0 || ComparanstState (atual, 0)) {return Current; }}}} /*** CHAMADA AQUIVAÇÃO ENTRECIMENTE para obter permissão em resposta para interromper*/public void adquirir () lança interruptedException {sync.acquiraryededinterruptivelmente (1);}/** *** A adquirir 1) para obter uma permissão não-responsiva*/anúncio público/syn) (sinalizador* syning. permissão*/public boolean tryacquire () {return sync.nonfairtryAcquiresaryed (1)> = 0;}/***Tente obter permissão, apoiar o tempo limite e interromper*/public boolean TryAcquire (longa timeout, unidade de tempo) lança interruptEdException {return (retorno (sínc.CrutAcquire (unidade de tempo, unidade de tempo de tempo; Suporte para obter permissão */public void adquirir (int permissões) lança interruptedException {if (permite <0) {lança new ilegalArgumentException (); } sync.acquiredarededInterruptível (Permissões);}/** * Obtenha permissão que não responda às interrupções */public void adquiririnterruptível (int permits) {if (permite <0) lançar novos ilegalarGumGumentException (); Sync.Acquireshared (Permissões);}/** * Tente obter permissão */public boolean TryAcquire (int permits) {if (permite <0) lança novo ilegalArgumentException (); Return sync.nonfairtryAcquirededed (Permissões)> = 0;}/** * Tente apoiar o mecanismo de tempo limite, apoie a aquisição de interrupções permitir */public boolean TryAcquire (int permissões, timout longo, unidade de tempo -unidade) lança interruptedException {if (permissão <0) lançando ilegalargudentMigment) () retornar sync.TryAcquiredNanos (Permissões, Unit.toNanos (Timout));} /** * Libere a permissão */public void release () {sync.releashareared (1);}/** * Libere a permissão */public void Release (int permissões) {if (permite <0) lançar novo ilegalArgumentException (); Sync.Releashared (permissões);} /** * Retorne permissão disponível */public int disponívelPermits () {return sync.getPermits ();}/** * consumindo permissão */public int drenperMits () {return sync.drainperMits ();}/** * redução da permissão de redução */protegido ReducedPerMits (Int Reduction) {se sync.reducePermits(reduction);}/** * Determine whether it is a fair version*/public boolean isFair(){ return sync instanceof FairSync;}/** * Return the waiting thread in Sync Queue in AQS*/public final boolean hasQueuedThreads(){ return sync.hasQueuedThreads();}/** * Return the waiting thread length in Sync Queue in Aqs*/public final int getQueuelgen () {return sync.getQueuelngth ();}/***Retorne o tópico de espera na fila de sincronização em aqs*/coleção protegida <Thread> getQueuethreads () {return sync.getqueedthreads ();}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.