세마포어는 주로 동시 코드 실행을 제어하는 도구 클래스의 수를 제한하고 허가를 통해 동시 실행 수를 내부적으로 정의하는 데 사용됩니다.
/** * 비 페어 버전 구성 요소 세마포어 */public ksemaphore (int remits) {sync = new nonfairsync (허가);}/** * 버전 구성 요소 semaphore */public ksemaphore (int remits, boolean fair) {sync = fair? New FairSync (허가) : New Nonfairsync (허가);} /** aqs 서브 클래스 메인 정의 릴리스 잠금 장치*/초록 정적 클래스 동기화 kabstractqueuedsynchronizer {private static final long serialversionuid = 1192457210091910933L; / ** * 허가를 지정하여 semaphore */ sync (int remits) {setstate (허가); } / ** * 나머지 허가를 반환 * / 최종 int getPermits () {return getState (); } / ** * 허가 받기 * / final int nonfairtryAcquireshared (int arcies) {for (;;) {int availed = getState (); int 나머지 = 사용 가능 - 획득; // 획득을 얻기 위해 나머지 허가의 수를 결정합니다. }}}}} / ** * 릴리스 잠금 * / 보호 된 최종 부울 tryreleaseShared (int 릴리스) {for (;;) {int current = getState (); int next = current + 릴리스; if (next <current) {// 오버 플로우 던지기 새 오류 ( "최대 허가 수 초과"); } if (compareAndsetstate (current, next)) {// cas change state return true; }}} 최종 void reterPermits (int retures) {// (;;) {int current = getState ()에 대한 허가를 줄입니다. int next = 전류 - 감소; if (next> current) {// 언더 플로우 던지기 새 오류 ( "Count Underflow"); } if (compareAndsetState (current, next)) {return; }}}} / ** 0* / final int drainpermits () {for (;;) {int current = getState (); if (current == 0 || compareAndsetstate (current, 0)) {return current; }}}} /*** 인터럽트에 대한 응답으로 허가를 받으려면 획득을 받으려면 획득을 받으려면 aquiReshared arceptrible (1); */public boolean tryacquire () {return sync.nonfairtryacquireshared (1)> = 0;}/*** 허가, 지원 시간 초과 및 인터럽트 지원*/public boolean tryacquire (긴 타임 아웃, 시간 유닛) wrows interruptedException {return sync.tryAcquiresharednanos (1, timeout.time) 허가 */public void auctire (int remits) 던지기 중간 exception {if (remits <0) {throw new neveralargumentexception (); } sync.acquiresharedInterruptibly (허가);}/** * 인터럽트에 응답하지 않는 권한 받기 */public void arcireUnInterruptibly (int remits) {if (remits <0) 새로운 불법 불법 행위 텍스트 (); sync.acquireshared (허가);}/** * 허가를 받으려고 시도 */public boolean tryacquire (int remits) {if (허가 <0) 새로운 불법 불법 행위 렉싱 (); Return Sync.NonfeairtryAcquireshared (허가)> = 0;}/** * 시간 초과 메커니즘을 지원하고 인터럽트 허가를 지원하십시오 */public boolean tryacquire (int remits, long simout, timeUnit init) 던지기 방해 {if (허가 <0) throws throws <0) (). return sync.ryacquiresharednanos (허가, unit.tonanos (timout));} /** * 릴리스 허가 */public void release () {sync.releasShared (1);}/** * 릴리스 허가 */public void release (int remits) {if (허가 <0) 새로운 불법 불법 행정 exception (); Sync.ReleasShared (허가);} /** * return return rectim */public int availermits () {return sync.getpermits ();}/** * 소비 허가 */public int drainpermits () {return sync.drainpermits ();}/** * 감소 감소 */protected void rowpermits (int retuction retuction) sync.reducepermits (retuction);}/*** 공정 버전인지 결정*/public boolean isfair () {return sync instanceof fairsync;}/*** aqs*/problice hasqueuedthreads () {return sync.hasqueuedthths ()의 return sync.hasqueuedthths (); aqs*/public final int getqueueleng () {return sync.getqueuelenger ();}/***aqs*/protected collection <thread> getqueuthreads () {return sync.getqueuedthreads ();}의 대기 스레드를 반환합니다.위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.