美文网首页
Semaphore源码分析

Semaphore源码分析

作者: SnailFast | 来源:发表于2019-09-16 22:01 被阅读0次

整体概况

        Semaphore是借助AQS实现的的共享锁,通过构造参数可以给状态变量赋值,用来控制对资源访问的并发度。Semaphore代码很简洁,主要方法就两个,一个是获取资源许可方法acquire,一个是释放资源方法release,这两个方法都是利用内部的同步器对状态变量的控制来实现的,整体源码结构如下图所示。

Semaphore源码概况

Sync

        和ReentrantLock类似,Semaphore内部的AQS同步控制器也分为公平和非公平两种,区别只是在获取资源许可的时候是否会考虑排队队列情况。NonfairSync不会考虑队列情况,当资源数量不为0时,死循环一直抢占,直到抢到资源许可或者资源数量为0为止。而FairSync在获取锁时会考虑现有队列情况,如果队列中有其他线程在排队,则当前线程直接去排队。源代码情况如下图所示。

NonfairSync获取资源许可方法 FairSync获取资源许可方法

acquire

        Semaphore获取资源许可的方法,实现方式是借助内部的AQS同步控制器将资源数量减1,可以通过Semaphore的构造函数来选择acquire方法的实现是公平的还是非公平的。源代码情况如下图所示。

acquire方法源码 acquireSharedInterruptibly方法内部调用tryAcquireShared Semaphore内部同步控制器重写了tryAcquireShared

release

         Semaphore释放获取的方法,实现方式是借助内部的AQS同步控制器将资源数量加1,死循环一直调用CAS方法。源代码情况如下图所示。

release方法 release方法内部调用tryReleaseShared方法 tryReleaseShared方法

        注意,由于tryReleaseShared方法没有对状态变量的上限做保护,所以一定要在调用acquire方法之后再调用release方法,不然可能会使资源许可的数量超过Semaphore构造函数设置的值,导致过多的线程对资源的并发访问。

相关文章

  • Semaphore 源码分析

    Semaphore 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅...

  • Semaphore 源码分析

    需要提前了解的知识点: AbstractQueuedSynchronizer 实现原理 类介绍 Semaphore...

  • Semaphore源码分析

    1. Semaphore 定义 Semaphore 主要用于限量控制并发执行代码的工具类, 其内部通过 一个 pe...

  • Semaphore源码分析

    整体概况 Semaphore是借助AQS实现的的共享锁,通过构造参数可以给状态变量赋值,用来控制对资源访问的并发度...

  • Semaphore源码分析

    1.概述 这篇文章主要用来介绍Semaphore源码。应该也是最后一篇了。还有一个chm感觉有些地方还有点问题,就...

  • Java Semaphore源码分析

    Semaphore介绍 Semaphore,信号量,用来控制访问特定数量的共享资源,当线程线程想访问共享资源时,必...

  • AQS共享锁 - Semaphore(信号量)

    1,Semaphore源码分析 1)内部类Sync实现了AQS。使用AQS的volatile state属性,代表...

  • 8.AQS共享锁

    一、Semaphore实现原理解析 1.1Semaphore实例 1.2Semaphore源码解析 new Sem...

  • 【本人秃顶程序员】Java并发专题:Semaphore信号量源码

    ←←←←←←←←←←←← 快,点关注!JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 ...

  • 并发编程之 Semaphore 源码分析

    前言 并发 JUC 包提供了很多工具类,比如之前说的 CountDownLatch,CyclicBarrier ,...

网友评论

      本文标题:Semaphore源码分析

      本文链接:https://www.haomeiwen.com/subject/xgnryctx.html