前言
本篇开始分析Semaphore(信号量)的源码,分析结束后,会用一个示例展示Semaphore的应用场景。
1、简介
Semaphore是一个计数信号量,维护了一个信号量许可集。每次调用acquire()都将消耗一个许可,每次调用release()都将归还一个许可。
2、结构图
Semaphore的内部维护了一个Sync内部类,Sync是继承AQS的抽象类,Sync包括两个子类:"公平信号量"FairSync 和 "非公平信号量"NonfairSync。
3、分析源码
3.1、信号量构造函数
public Semaphore(int permits) {
//默认构造非公平信号量
sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
3.2、公平信号量获取
Semaphore中的方法源码:
public void acquire() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
public void acquire(int permits) throws InterruptedException {
if (permits < 0) throw new IllegalArgumentException();
sync.acquireSharedInterruptibly(permits);
}
sync中调用的acquireSharedInterruptibly方法在AQS中,源码如下:
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
// 如果线程是中断状态,则抛出异常。
if (Thread.interrupted())