这节我们来看一下信号量的实现方式,下面是我们本次的入口代码,我们先看一下非公平的方式是怎么做的:
Semaphore semaphore = new Semaphore(1);
semaphore.acquire(1);
semaphore.release(1);
首先来看一下它的构造方法:
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}
它是基于非公平框架实现的:
Sync(int permits) {
setState(permits);
}
最后调用父类的构造方法保存了我们传入的资源的个数,下面就开始看只存在一个线程获取资源的时候流程是怎样的:
public void acquire(int permits) throws InterruptedException {
if (permits < 0) throw new IllegalArgumentException();
sync.acquireSharedInterruptibly(permits);
}
在共享模式下获得资源,如果获取资源的线程被中断了,那么就终止资源获取:
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}
先尝试在共享模式下获取资源,会返回获取资源后还剩下的资源的数量,如果小于0,说明有一部分资源不能获取到,导致资源获取失败,需要等待其他线程释放资源后再获取
protected int tryAcquireShared(int acquires) {
return nonfairTryAcquireShared(acquires);
}
非公平模式下尝试获取资源:
final int nonfairTryAcquireShared(int acquires) {
for (;;) {
//获取还剩下的可获取的资源的数量
int available = getState();
//计算如果当前线程获取到了所需要的资源后还剩下多少资源
int remaining = available - acquires;
//如