Ch15-Java tools 之 Semaphore
March 24, 2020
java.util.concurrent.Semaphore
类表示信号量。Semaphore 内部主要通过 AQS(AbstractQueuedSynchronizer)实现线程的管理。
1. 重要变量 #
Semaphore 中的 Sync 继承自 AQS,因此其临界资源为 AQS 中的 state Semaphore 将 state 定义为 permits 表示许可数。
线程在运行时首先获取许可,如果成功,许可数就减 1,线程运行,当线程运行结束就释放许可,许可数就加 1。如果许可数为 0,则获取失败,线程位于 AQS 的等待队列中,它会被其它释放许可的线程唤醒。
2. 核心接口 #
public class Semaphore implements java.io.Serializable {
abstract static class Sync extends AbstractQueuedSynchronizer {
protected final boolean tryReleaseShared(int releases);
protected final boolean tryRelease(int releases);
}
static final class NonfairSync extends Sync {
protected int tryAcquireShared(int acquires);
}
static final class FairSync extends Sync {
protected int tryAcquireShared(int acquires)
}
public void acquire();
public void release();
}
到这里其实就很显然可以看出 Semaphore 的工作原理其实很简单。
- 每次调用 acquire() 方法的时候,都是对 AQS 中的 state 减 1,直到 state 小于 0,便将自己挂起,放入 AQS 的 CLH。
- 每次调用 release() 方法的时候,都是对 AQS 中的 state 加 1,并唤醒 AQS 的 CLH 中的所有 NODE(线程)。