Semaphore в основном используется для ограничения количества классов инструментов, которые управляют одновременным выполнением кода, и внутренне определяет количество одновременных выполнений с помощью разрешения.
/** * Используйте нефурную версию Семфоре */public ksemaphore (int разрешает) {sync = new nonfairsync (разрешения);}/** * Укажите версию компонент Semaphore */public ksemaphore (int разрешает, Boolean Fair) {Sync = Fair? New Fairsync (разрешения): новый nonfairsync (разрешения);} /** AQS Подкласс Основное определение GET LOCK LOCK*/Аннотация Статический класс Sync Extends KabstractQueudSynchronizer {Private Static Final Long SerialVersionUID = 1192457210091910933L; / ** * Укажите разрешение инициализировать Semaphore */ sync (int разрешает) {setState (разрешения); } / ** * вернуть оставшееся разрешение * / final int getPermits () {return getState (); } / ** * Получить разрешение * / final int nonfairtryAcquireShared (int приобретает) {for (;;) {int affect = getState (); int остается = доступно - приобретает; // Определите количество оставшихся разрешений для получения приобретения, если (оставшееся <0 || CompareAndsetState (доступно, оставшееся)) {// CAS изменение состояния возврата осталось; }}}} / ** * Выпуск блокировки * / Защищенный окончательный логический int next = current + релизы; if (next <current) {// переполнить новую ошибку («максимальное количество разрешений превышен»); } if (CompareAndsetState (current, Next)) {// CAS изменить состояние возврата true; } / int next = current - сокращение; if (Next> Current) {// недостаток в новой ошибке («Подсчет разрешений недостаточно»); } if (CompareAndsetState (current, Next)) {return; }}}} / ** Установить разрешение на 0* / final int drainpermits () {for (;;;) {int current = getState (); if (current == 0 || CompareAndsetState (current, 0)) {return current; }}}} /** * Позвоните в AcquireSharedEverseable, чтобы получить разрешение в ответ на прерывание */public void acpire () бросает прерывания, {sync.acquireshared Intervintable (1);}/** * Вызовите приобретение приобретения, чтобы получить разрешение в не-респонсивном прерывании. Boolean TryAcquire () {return sync.nonfairtryacquireshared (1)> = 0;}/*** Попробуйте получить разрешение, время поддержки и прерывание*/public boolean tryAcquire, время -аут, единица времени) void affire (int разрешает) бросает прерванную экзенцию {if (разрешает <0) {бросить новый allosalargumentException (); } sync.AcquiresharedEntertaill (разрешает);}/** * Получить разрешение, которое не отвечает на прерывания */public void приобретает UnfireUnintertible (int разрешает) {if (разрешает <0) бросить новый allosalArgumentException (); sync.acquireshared (разрешения);}/** * Попробуйте получить разрешение */public boolean tryacquire (int разрешает) {if (разрешает <0) бросить новый allosalargumentException (); Вернуть Sync.nonfairtryAcquireShared (разрешения)> = 0;}/** * Попробуйте поддержать механизм тайм -аута, поддержать приобретение разрешения на прерывания */public boolean tryAcquire (int, длинный размер времени, время UNIT). return sync.tryacquiresharednanos (разрешения, Unit.tonanos (Timeut));} /** * Разрешение на выпуск */public void release () {sync.ReleaseShared (1);}/** * разрешение на освобождение */public void release (int разрешает) {if (разрешает <0) выбрать новый allosalargumentException (); sync. -releaseShared (разрешения);} /** * Возвращение доступного разрешения */public int affermits () {return sync.getpermits ();}/** * Потребление разрешения */public int drainpermits () {return sync.drainpermits ();}/** * Уменьшение разрешения на сокращение */Защищенные void retreppermits (int retence) {if (mred (0) newlodalargement (); sync.reducepermits (сокращение);}/*** Определите, является ли это справедливой версией*/public boolean isfair () {return sync extmentof fairsync;}/*** Возвращение потока ожидания в очередь синхронизации в aqs*/public final booleanthueuedthreads () {return sync.hasqueuedthreadts (); ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** Aqs*/public final int getQueueldethene () {return sync.getqueueldength ();}/***Возврат потока ожидания в очередь синхронизации в aqs*/protected collection <Thorte> getQueUethreads () {return sync.getqueuedThreads ();}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.