`
Jen
  • 浏览: 57532 次
  • 性别: 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
分享到:
评论

相关推荐

    狂神说JUC代码狂神说JUC代码

    8. **Semaphore**:信号量,用于控制同时访问特定资源的线程数量。 9. **CompletableFuture**:异步编程模型,提供了链式调用和组合多个异步任务的能力,使得异步编程更加简洁。 通过学习《狂神说JUC代码》这个...

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

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

    juc aqs java

    juc 的aqs介绍。

    个人学习JUC代码笔记总集

    这个压缩包文件“个人学习JUC代码笔记总集”显然是一个个人的学习资源,记录了对JUC组件的理解和应用实例,特别适合已经有一定Java基础,想要深入学习并发编程的开发者。 JUC的主要目标是简化并发编程,提高多线程...

    这就是标题—— JUC.pdf

    Semaphore(信号量,流量控制) ReentrantReadWriteLock (读写锁) BlockingQueue(阻塞队列) 线程池 池化技术 线程池的优势 线程池的特点 线程池三大方法 线程池七大参数 线程池四种拒绝策略 ForkJoin 异步回调 ...

    JUC代码收集,java高并发多线程学习

    本资源"JUC代码收集,java高并发多线程学习"显然是一个专注于探讨和学习JUC库的资料包。 JUC库包含多个子包,如`concurrent`, `atomic`, `locks`等,每个子包都有其特定的功能和用途: 1. **concurrent**:这是JUC...

    AQS和JUC知识点讲解

    《AQS和JUC知识点详解》 在Java并发编程领域,AbstractQueuedSynchronizer(AQS)和Java Util Concurrency(JUC)是两个至关重要的概念。它们为开发高效、线程安全的多线程程序提供了强大的工具。本文将深入解析这...

    java并发编程专题(六)----浅析(JUC)Semaphore

    在示例代码中,我们还使用了 Semaphore 的 availablePermits() 方法来获取当前可用的信号量数量,并使用 System.out.println() 方法来打印当前可用的信号量数量。 Semaphore 的优点是可以控制多个线程访问共享资源...

    JUC AQS的加解锁.pdf

    Java的并发编程是多线程和多任务处理的核心技术之一,而在Java并...开发者可以基于AQS创建复杂的同步结构,满足各种并发场景的需求。理解AQS的工作原理,对于使用Java并发包以及开发高性能的多线程应用具有重要的意义。

    juc学习代码。。。。

    首先,JUC库中的`java.util.concurrent`包包含了大量并发工具类,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)、`CountDownLatch`(倒计时门锁)等。这些工具类可以帮助开发者更精细地控制并发执行的流程...

    java并发编程:juc、aqs

    AQS通过内部维护一个基于链表的等待队列,有效地管理线程的同步和唤醒,从而实现锁和其他同步原语。 **AQS核心特性:** 1. **资源管理**:AQS定义了两种资源获取方式:独占和共享。独占模式下,只有一个线程能访问...

    Java——JUC

    10. **Semaphore信号量** - 控制同时访问特定资源的线程数量,可用于限流和保护共享资源。 这些工具和接口共同构建了Java的并发编程框架,使得开发者能够高效、安全地编写多线程程序,解决复杂的并发问题。熟练...

    JUC(一)-AQS源码分析

    为了学习JUC,AQS是基础中的基础,所以我们首先深入了解下AQS。 一、锁的介绍 为了了解AQS的源码,我们需要先大概下锁中的一些功能 1.1 乐观锁/悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同...

    JUC核心类AQS的底层原理

    AQS作为Java并发工具包(JUC)中的一个核心抽象类,其设计目的是为了实现各种同步器(如锁、信号量等)。AQS主要通过三个核心组成部分来实现这些同步组件的功能: 1. **State变量及其CAS操作**:AQS维护了一个名为`...

    juc并发编程脑图以及相关示例代码

    juc并发编程脑图以及相关示例代码

    JUC代码演示 Java多线程并发

    除了`synchronized`之外,Java还提供了更灵活的锁机制——`Lock`接口。`Lock`接口提供了比`synchronized`更强大的锁定机制,并且实现了更加精细的线程控制。 在示例中,使用了`ReentrantLock`类来实现自定义的锁: ...

    JUC并发工具包实例.zip

    许多并发工具,如ReentrantLock、Semaphore等,都基于AQS实现。AQS维护了一个内部状态以及一个等待线程的双端队列,通过共享或独占模式来控制资源的访问。在AQS中,线程可以通过acquire()方法获取资源,通过release...

    JUC AQS(AbstractQueuedSynchronizer)

    ReentrantLock Lock 加锁过程源码分析图,AQS 源码分析

    尚硅谷大厂必备技术之JUC并发编程基础视频 配套资料(自己根据视频整理课件,和代码)

    【尚硅谷】大厂必备技术之JUC并发编程视频 配套资料,自己根据视频整理 pdf 课件,和代码 视频地址:...

    基于JUC的多线程网页爬虫.zip

    本项目"基于JUC的多线程网页爬虫"显然是利用了JUC库来构建一个能够并行抓取网页内容的爬虫系统。下面我们将深入探讨这个项目可能涉及到的JUC知识点以及多线程爬虫的基本原理。 首先,JUC的核心组件包括`...

Global site tag (gtag.js) - Google Analytics