版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ONROAD0612/article/details/82492784
1 概述
通过前面(参考JUC-- Semaphore学习(一)简介和使用 )对Semaphore的介绍,我们对Semaphore有了一个基本的认识,我们知道Semaphore通常用于限制对资源使用的线程数量,现在就要针对Semaphore的源码进行分析,Semaphore的结构如下:
从上图我们可以发现,这里又出现了AQS的身影,我们可以看出AQS的重要性。所以再学习JUC的时候非常有必要对AQS的源码有个深入学习。并且这里有公平和非公平两种实现方式。我们接下来会分析是如何实现的。
2 属性
private final Sync sync;
至此我们可以猜想Semaphore的功能实现主要是依靠Sync来实现的,而通过之前对AQS的学习我们知道针对AQS的设计使用了模板方法模式,所以不难想到,这里的Sync里面实现的就是模板方法模式中的基本方法。
3 构造函数
(1)创建指定数量的信号量,默认为非公平模式。
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}
(2)创建指定数量的信号量,根据指定的公平模式选择同步机制。
public Semaphore(int permits, boolean fair) {
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
4 具体方法分析
我们知道针对Semaphore中锁的获取有公平和非公平模式,所以我们这里就针对这两种模式来分别分析两个核心的方法的实现。
4.1 非公平模式
(1)acquire()
我们首先来看一下这个方法的调用顺序:
(2)release()
4.2 公平模式
(1)acquire()
(2)release()