jdk源码解析四之Semaphore 野性酷女 2023-02-20 12:08 11阅读 0赞 ### 文章目录 ### * Semaphore * * acquire * release * 总结 # Semaphore # 计数信号量:控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,实现某种资源池,对容器施加边界 ## acquire ## 步骤同CountDownLatch.wait public void acquire() throws InterruptedException { sync.acquireSharedInterruptibly(1); } protected int tryAcquireShared(int acquires) { return nonfairTryAcquireShared(acquires); } final int nonfairTryAcquireShared(int acquires) { //<0才阻塞 for (;;) { //获取同步状态的值。 int available = getState(); int remaining = available - acquires; //available为0或者更新成功,直接返回 if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } } ## release ## public void release() { sync.releaseShared(1); } protected final boolean tryReleaseShared(int releases) { for (;;) { //获取同步状态的值。 int current = getState(); //累加 int next = current + releases; //内存溢出,也就是超过了Integer范围上限 if (next < current) // overflow throw new Error("Maximum permit count exceeded"); //修改值返回 if (compareAndSetState(current, next)) return true; } } ## 总结 ## 与闭锁和其类似,闭锁是为0,才可以访问,信号量恰恰相反, 信号量和闭锁的区别是不是一次性的,可以重复限定多少线程可以访问资源. 如果不限定释放的条件,可以不停的释放从而超过构造设置的许可个数, 建议这样使用 public boolean add(T o) throws InterruptedException { //阻塞获得许可 sem.acquire(); boolean wasAdded = false; try { wasAdded = set.add(o); return wasAdded; } finally { //返回许可给信号量 if (!wasAdded) sem.release(); } } public boolean remove(Object o) { boolean wasRemoved = set.remove(o); if (wasRemoved) sem.release(); return wasRemoved; }
相关 jdk源码解析八之NIO 文章目录 Buffer ByteBuffer MappedByteBuffer DirectByteBu 素颜马尾好姑娘i/ 2023年02月22日 05:12/ 0 赞/ 128 阅读
相关 jdk源码解析七之ReadWriteLock 文章目录 ReadWriteLock ReentrantReadWriteLock 构造 获取读写锁 灰太狼/ 2023年02月21日 11:42/ 0 赞/ 52 阅读
相关 jdk源码解析四之Semaphore 文章目录 Semaphore acquire release 总结 Semaphore 计数信号量:控制同时访问某个 野性酷女/ 2023年02月20日 12:08/ 0 赞/ 12 阅读
相关 jdk源码解析四之FutureTask 文章目录 FutureTask 构造 带返回构造 run get cancel f Dear 丶/ 2023年02月20日 12:08/ 0 赞/ 19 阅读
相关 jdk源码解析四之CountDownLatch 文章目录 CountDownLatch await countDown cancelAcquire 总结 怼烎@/ 2023年02月20日 12:08/ 0 赞/ 22 阅读
相关 jdk源码解析三之ConcurrentHashMap 文章目录 ConcurrentHashMap put 初始化 扩容 ge た 入场券/ 2023年02月20日 12:07/ 0 赞/ 47 阅读
相关 JUC框架 Semaphore源码解析 JDK8 文章目录 前言 重要成员 构造器 获取信号量(减小state) 非公平实现的tryAcquireShared 公平实现的 淡淡的烟草味﹌/ 2023年02月20日 06:29/ 0 赞/ 43 阅读
相关 Semaphore源码解析。 / 一个计数信号量。从概念上讲,信号量维护了一个许可集。 如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。 Myth丶恋晨/ 2021年11月22日 15:58/ 0 赞/ 406 阅读
还没有评论,来说两句吧...