`
Jen
  • 浏览: 57849 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JUC代码浅析[4]——基于AQS的信号量Semaphore

    博客分类:
  • java
阅读更多

JUC代码浅析[4]——基于AQS的信号量Semaphore

       Semaphore是基于AQS共享模式实现的计数信号量,它维护一个资源一个时期内最多访问者个数。超过限制数量的线程被阻塞。使用state表示许可的个数。acquire操作减少计数,release增加计数,许可计数为0时就不允许新的访问进入。

 

获取许可,

    public void acquire() throws InterruptedException {

    //acquireSharedInterruptibly方法参考AQS的介绍

        sync.acquireSharedInterruptibly(1);

    }

 

信号量sync也分为公平和非公平的实现,其中非公平sync,剩余许可小于0时线程就进入队列阻塞等待AQS调度

        protected int tryAcquireShared(int acquires) {

            return nonfairTryAcquireShared(acquires);

        }

 

        final int nonfairTryAcquireShared(int acquires) {

            for (;;) {

                int available = getState();

                int remaining = available - acquires;

                if (remaining < 0 ||

                    compareAndSetState(available, remaining))

                    return remaining;

            }

        }

 

公平sync,只要当前线程不处于AQS队列的首位就进入队列阻塞等待调度,在首位时跟非公平一样

        protected int tryAcquireShared(int acquires) {

            Thread current = Thread.currentThread();

            for (;;) {

                Thread first = getFirstQueuedThread();

                if (first != null && first != current)

                    return -1;

                int available = getState();

                int remaining = available - acquires;

                if (remaining < 0 ||

                    compareAndSetState(available, remaining))

                    return remaining;

            }

        }

 

释放许可,比较简单,增加许可

        protected final boolean tryReleaseShared(int releases) {

            for (;;) {

                int p = getState();

                if (compareAndSetState(p, p + releases))

                    return true;

            }

        }

 

0
0
分享到:
评论

相关推荐

    Java 多线程与并发(10-26)-JUC锁- 锁核心类AQS详解.pdf

    它是实现Java并发包中锁和其他同步器的基础框架,例如ReentrantLock(可重入锁)、Semaphore(信号量)、CountDownLatch(倒计时门闩)、CyclicBarrier(循环栅栏)以及ReentrantReadWriteLock(可重入读写锁)等。...

    精心整理的AQS和JUC相关的面试题.pdf【ReentrantLock】

    除了ReentrantLock,JUC中还包含其他并发工具类,如Semaphore信号量、ReadWriteLock读写锁、CountDownLatch倒计时器、CyclicBarrier循环栅栏和LockSupport线程阻塞工具类。 Semaphore信号量是对锁的扩展,可以用来...

    java并发编程-AQS和JUC实战

    #### 三、Semaphore 信号量 - **概述**:`Semaphore` 是一种用于控制同时访问特定资源的线程数量的同步工具类。 - **常用方法**: - `acquire()`:获取许可,如果没有足够的许可,则等待。 - `release()`:释放一...

    java编发编程:JUC综合讲解

    - **Semaphore**:信号量,控制同时访问特定资源的线程数量。 - **Phaser**:Java 7引入的同步辅助类,可以动态注册和取消线程,当所有线程到达一个阶段时进行同步。 理解并熟练运用这些JUC库的核心概念和类,对于...

    Java并发系列之Semaphore源码分析

    Semaphore(信号量)是JUC包中比较常用到的一个类,它是AQS共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制。Semaphore提供了一个许可证的...

    深入浅出_Java并发工具包原理讲解

    3. 各种并发工具类:包括闭锁(CountDownLatch)、栅栏(CyclicBarrier)、信号量(Semaphore)、读写锁(ReentrantReadWriteLock)等,这些工具类提供了丰富的线程间协调和控制的机制,使得多线程之间的合作更加...

    The java.util.concurrent synchronizer framework.pdf

    文档明确指出,Doug Lea为J2SE 5.0引入的java.util.concurrent包提供了一套精巧的同步器框架,这套框架极大地简化了并发控制的实现,并且在多个领域提供了高效的同步原语,如锁、条件变量、信号量、事件标志等。...

    资深程序员的Java面试题总结汇总.pdf

    13. JUC中的并发工具包括Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门闩)等。 14. ReadWriteLock提供了读写锁分离,提高并发性能;StampedLock提供了更细粒度的锁控制。 15. 通过...

    【美团】Java 岗 154 道面试题1

    【美团】Java 岗 154 道面试题涵盖了Java集合、JVM调优和并发编程等...55. **JUC并发工具**:还包括Semaphore(信号量)、CountDownLatch、CyclicBarrier、ThreadPoolExecutor等。 56. **ReadWriteLock 和 StampedLock

Global site tag (gtag.js) - Google Analytics