Le sémaphore est principalement utilisé pour limiter le nombre de classes d'outils qui contrôlent l'exécution de code simultanée et définit en interne le nombre d'exécutions simultanées via un permis.
/ ** * Utiliser le composant de version non-FAIR Semaphore * / public ksemaphore (int permets) {sync = new nonfairSync (permts);} / ** * Spécifiez le composant de version Semaphore * / public ksemaphore (int permets, booolean fair) {sync = fair? Nouveau FairSync (permis): Nouveau non-FairSync (permis);} / ** Définition principale de la sous-classe AQS Get Release Lock * / Abstract Static Class Sync étend KabstractqueueEdSynchronizer {private static final long SerialVersionUID = 1192457210091910933l; / ** * Spécifier l'autorisation Initialize Semaphore * / Sync (int permis) {setState (permis); } / ** * Renvoie le permis restant * / final int getpermits () {return getState (); } / ** * Get Permission * / Final int nonfairtryacquireRared (int acquére) {for (;;) {int disponible = getState (); int resing = disponible - acquérir; // Déterminer le nombre de permis restants pour obtenir des acquisition if (restant <0 || comparabledSetState (disponible, restant)) {// CAS Change State Retour restant; }}}} / ** * Lock de libération * / Final Boolean Final Protected TryReleSeshared (Int Releases) {for (;;) {int current = getState (); INT NEXT = COURT + rejets; if (suivant <current) {// débordera une nouvelle erreur ("le nombre de permis maximum dépassé"); } if (comparabledSetState (courant, suivant)) {// Cas Change State return true; }}} final void réductionPerMits (int réductions) {// Réduire les permis pour (;;) {int current = getState (); int next = courant - réductions; if (suivant> courant) {// Underflow Throw New Error ("Permis Count Underflow"); } if (comparabledSetState (courant, suivant)) {return; }}}} / ** Définir le permis sur 0 * / final int drainpermits () {for (;;) {int current = getState (); if (current == 0 || compareAndSetState (current, 0)) {return current; }}}} / ** * Appelez acquérir-ininterruption pour obtenir l'autorisation en réponse à l'interruption * / public void acquérir () lance InterruptedException {sync.acquireraredaredinterruptily (1);} / ** * Appeler acquérir un acquis * / public booléen tryacquire () {return sync.NONFairTryAcquireShared (1)> = 0;} / ** * Essayez d'obtenir l'autorisation, le délai de support et l'interruption * / public booléen tryacquire (longue date, timeunit unit) lance InterruptedException {return sync.recquireareda Autorisation * / public void acquérir (int permis) lève InterruptedException {if (permis <0) {New illégalArgumentException (); } sync.ACQUIRESHARED INTERRUBLIBLY (permis);} / ** * Obtenez l'autorisation qui ne répond pas aux interruptions * / public void acquireunInterruptily (int permis) {if (permis <0) lancez new illégalargumentException (); sync.acquireRared (permis);} / ** * Essayez d'obtenir l'autorisation * / public boolean tryacquire (int permets) {if (permis <0) lance un nouveau illégalargumentException (); RETOUR SYNC.NONFAIRSTRYACQUIRARED (permis)> = 0;} / ** * Essayez de soutenir le mécanisme du délai d'expiration, soutient l'acquisition de permis d'interruptions * / public booléen tryacquire (INT permis, Long Timout, TimeUnit Unit) lance InterruptedException {if (permis <0) lance un nouvel illégalException (); Retour Sync.TryacQuireresharedNanos (permis, unit.Tonanos (Timout));} / ** * Permis de libération * / public void release () {sync.reaseshared (1);} / ** * permis de libération * / public void release (int permets) {if (permis <0) lancez new illégalargumentException (); sync.reaseshared (permis);} / ** * RETOUR Permis disponible * / public int disponiblePermits () {return sync.GetperMits ();} / ** * Consommation de l'autorisation * / public int drainpermits () {return sync.DrainPermits ();} / ** * réduction du permis de réduction * / Vide Protected ReducePermits (int réduction) {if (réduction <0) Throw New IllégalArgmentException (); Sync.redUperEpermits (réduction);} / ** * Déterminez s'il s'agit d'une version équitable * / public boolean isfair () {return sync instanceof fairSync;} / ** * renvoie le thread d'attente dans la file d'attente de synchronisation dans aqs * / public final booléan hasqueeUdThreads () {return Sync.HasqueeEdThreads ();} / ** * RETOUR-RETRIEW THE FILD LIGHT QUUE DANS INSEURDS ();} / ** * Aqs * / public final int getqueUeUngth () {return sync.GetQueUeLngth ();} / ** * return le thread d'attente dans la file d'attente de synchronisation dans aqs * / collection protégée <read> getqueUeThreads () {return sync.getQueuedThreads ();}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.