`

Semaphore 源码分析

阅读更多

介绍:
Semaphore 用于对某一物理或逻辑资源被同一时间访问数量的限制.

实现:
Semaphore 是如何做到对某一物理或逻辑资源访问数量的限制了?

答案是 AQS.

比如我定义:Semaphore(10), 同一时刻只能有 10 个线程访问线程池,每来一个线程,state -1,当第11线程访问的结果是啥了?由于 state < 0 而被阻塞.

当一个线程访问完后,调用 release 方法,state + 1. 然后唤醒等待访问线程池的线程.

注意:

由于 release 方法中,没有对 state < 0 进行判断,每调用一次 release 方法 state + 1. 也就是说:虽然我定义的 state = 10. 但是我调用 11 次 release 方法,那么此时 state = 11.这就完成了
Semaphore 的动态增长.
如果说我觉得10个线程同时访问线程池,线程池扛不住了,我要减少同时访问的数量,该怎么办了?继承 Semaphore 类,重写 reducePermits 方法就好了.

Semaphore 和 CountDownLatch 对比分析

CountDownLatch 是为了共同干一件事,线程1完成A部分,线程2完成B部分,线程3完成C部分. 而 Semaphore 是为了限制同一时间对某一资源访问的数量, 例如:同一时间只允许10个线程同时访问.
0
0
分享到:
评论

相关推荐

    Java并发系列之Semaphore源码分析

    主要为大家详细介绍了Java并发系列之Semaphore源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java并发包源码分析(JDK1.8)

    Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...

    带你看看Java的锁(二)-Semaphore

    带你看看Java的锁-Semaphore前言简介使用源码分析类结构图SyncNonfairSyncFairSyncSemaphore 构造函数Semaphore 成员方法获取释放总结 前言 简介 Semaphore 中文称信号量,它和ReentrantLock 有所区别,...

    Java并发编程学习笔记

    5、Condition源码分析 6、ReentrantReadWriteLock底层实现原理 7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile...

    jdk1.8-source:JDK1.8源码分析包

    JDK1.8源码分析 相关的原始码分析结果会以注解的形式体现到原始码中 已完成部分: ReentrantLock CountDownLatch Semaphore HashMap TreeMap LinkedHashMap ConcurrentHashMap 执行器 ...

    汪文君高并发编程实战视频资源全集

     高并发编程第三阶段11讲 AtomicXXXFieldUpdater源码分析及使用场景分析.mp4  高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4  高并发编程第三阶段13讲 一个JNI程序的编写,通过...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段11讲 AtomicXXXFieldUpdater源码分析及使用场景分析.mp4  高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4  高并发编程第三阶段13讲 一个JNI程序的编写,通过...

    java抢票系统源码-distributed-lock-redis:手把手教你设计并实现一个基于Redis的分布式锁

    java抢票系统源码 本项目是以学习的目的来一步一步实现一个最简单的基于Redis实现的分布式锁 简介 在分布式环境中,需要一种跨JVM的互斥机制来控制共享资源的访问 例如,为避免用户操作重复导致交易执行多次,使用...

    java7hashmap源码-to-be-architect:成为Java架构师,你应该学习这些

    hashmap源码 to-be-architect to be a Java architect,you should learn these.This page is updated irregularly. Java基础 深入分析 Java SPI 机制和原理 并发编程专题 Executors线程池 线程池ThreadPoolExecutor...

    城院操作系统-实验报告-实验八.doc

    程序源码: #include &lt;unistd.h&gt; #include &lt;signal.h&gt; #include &lt;stdio.h&gt; #include &lt;semaphore.h&gt; #include &lt;fcntl.h&gt; int pid1,pid2; /*sem_t *S1; sem_t *S2; sem_t *S3; sem_t *S4;*/ //sem_t S1; //sem_t S2; ...

Global site tag (gtag.js) - Google Analytics