JUC-- Semaphore学习(二)源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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()

猜你喜欢

转载自blog.csdn.net/ONROAD0612/article/details/82492784
今日推荐