
成员变量privatefinalSyncsync;构造方法// 默认非公平指定许可数量publicSemaphore(intpermits){syncnewNonfairSync(permits);}// 指定许可公平/非公平模式publicSemaphore(intpermits,booleanfair){syncfair?newFairSync(permits):newNonfairSync(permits);}acquire// 获取1个许可可中断许可不足则阻塞publicvoidacquire()throwsInterruptedException{sync.acquireSharedInterruptibly(1);}acquireSharedInterruptiblypublicfinalvoidacquireSharedInterruptibly(intarg)throwsInterruptedException{// 线程中断直接抛异常if(Thread.interrupted())thrownewInterruptedException();// 调用子类Sync实现的tryAcquireSharedif(tryAcquireShared(arg)0)// 获取失败进入共享阻塞队列挂起线程与 CountdonwLatch 一致doAcquireSharedInterruptibly(arg);}tryAcquireShared返回 ≥0拿到许可方法直接返回不阻塞返回 0无许可执行doAcquireSharedInterruptibly阻塞线inttryAcquireShared(intacquires){returnnonfairTryAcquireShared(acquires);}finalintnonfairTryAcquireShared(intacquires){for(;;){intavailablegetState();intremainingavailable-acquires;// 剩余许可0返回负数阻塞否则CAS修改state返回剩余值if(remaining0||compareAndSetState(available,remaining))returnremaining;}}releasepublicvoidrelease(){sync.releaseShared(1);}releaseSharedpublicfinalbooleanreleaseShared(intarg){// 调用Sync实现的tryReleaseShared更新state许可数if(tryReleaseShared(arg)){// 释放成功唤醒阻塞队列里等待许可的线程与 CountdownLatch 一致doReleaseShared();returntrue;}returnfalse;}tryReleaseSharedprotectedfinalbooleantryReleaseShared(intreleases){for(;;){intcurrentgetState();intnextcurrentreleases;// 安全校验防止无限release导致int溢出if(nextcurrent)thrownewError(Maximum permit count exceeded);if(compareAndSetState(current,next))returntrue;}}总结new Semaphore(3) → NonfairSync 构造 → setState (3)acquire() → sync.acquireSharedInterruptibly (1) → nonfairTryAcquireShared (1)返回 state - 1 ≥ 0则获取成功不阻塞否则挂起线程等待唤醒release() → sync.releaseShared (1) → tryReleaseShared (1)state 1释放成功唤醒队列等待线程无则无操作