Ch15-Java tools 之 Semaphore

Ch15-Java tools 之 Semaphore

March 24, 2020
Java | JUC
java

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(线程)。