Semaphore是java并发工具类之一,他继承于AQS类,所以它的底层框架是AQS。他主要用于协调各个线程,以保证合理的使用公共资源,它的应用场景主要用于流控,例如数据库连接池。下面我们看看Semaphore源码,它是如何实现流控的。
Semaphore初始化默认使用的是非公平锁机制,看方法名便可知。
初始化许可证数量:
Sync(int permits) {
setState(permits);
}
获取锁
尝试获取许可证,并返回剩下的数量:
protected int tryAcquireShared(int acquires) {
return nonfairTryAcquireShared(acquires);
}
在AQS源码中,调取重写的tryAcquireShared,如果返回的值小于0,表示通行证数量已达到最大值,则将当前线程放入等待队列中,待有空余线程释放后唤醒。
//AbstractQueuedSynchronizer.java
public final void acquireShared(int arg) {
if (tryAcquireShared(arg) < 0)
doAcquireShared(arg);
}
释放锁
//Semaphore.java
public void release(int permits) {
if (permits < 0) throw new IllegalArgumentException();
//释放锁的数量
sync.releaseShared(permits);
}
进入AQS类的源码中查看,doReleaseShared将线程释放,并唤醒等待唤醒的线程。
进入Semaphore.java查看重写的tryReleaseShared方法