`
m635674608
  • 浏览: 5028732 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

《java.util.concurrent 包源码阅读》17 信号量 Semaphore

    博客分类:
  • java
 
阅读更多

java.util.concurrent 包源码阅读》17 信号量 Semaphore

学过操作系统的朋友都知道信号量,在java.util.concurrent包中也有一个关于信号量的实现:Semaphore。

从代码实现的角度来说,信号量与锁很类似,可以看成是一个有限的共享锁,即只能被有限数量的线程使用的共享锁。

因为存在计数,因此Semaphore的构造函数有参数permits来设定计数:

    public Semaphore(int permits) {        sync = new NonfairSync(permits);    }

涉及到线程排队等待的问题,Semaphore也支持fair和unfair模式:

    public Semaphore(int permits, boolean fair) {        sync = fair ? new FairSync(permits) : new NonfairSync(permits);    }

说到线程排队,前面在说“锁”的时候讲过AbstractQueuedSynchronizer,它实现了类似获取锁失败,管理等待的线程的功能。因此信号量的实现同样需要借助这个类。

abstract static class Sync extends AbstractQueuedSynchronizer// Unfair模式的实现static final class NonfairSync extends Sync// Fair模式的实现static final class FairSync extends Sync

Sync类使用AbstractQueuedSynchronizer的state来存储信号量的计数:

        Sync(int permits) {            setState(permits);        }

因为信号量与共享锁类似,因此在获取资源和释放资源的时候使用的都是AbstractQueuedSynchronizer的shared类型的方法。

再次回到前面的unfair和fair模式,这种所谓的公平体现在获取锁的时候:unfair是后来先得,fair是先来先得。来看两者的尝试获取资源的方法:

        // unfair模式        final int nonfairTryAcquireShared(int acquires) {            // 直接检查是不是有资源,根本不看前面有没有其他排队的            for (;;) {                int available = getState();                int remaining = available - acquires;                if (remaining < 0 ||                    compareAndSetState(available, remaining))                    return remaining;            }        }        // fair模式        PRotected int tryAcquireShared(int acquires) {            for (;;) {                // 先看看有没有排队的                if (hasQueuedPredecessors())                    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 current = getState();                int next = current + releases;                if (next < current) // overflow                    throw new Error("Maximum permit count exceeded");                if (compareAndSetState(current, next))                    return true;            }        }

关于信号量的实现,有了AbstractQueuedSynchronizer和锁的基础,是非常好理解的。

 

 

http://www.knowsky.com/623744.html

分享到:
评论

相关推荐

    java并发工具包 java.util.concurrent中文版用户指南pdf

    15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...

    java.util.concurrent 学习ppt

    2. **Semaphore**:信号量,用于限制同时访问特定资源的线程数量。 3. **BlockingQueue**:阻塞队列,线程安全的数据结构,当队列为空时,取元素的线程会被阻塞,直到有元素放入;反之,当队列满时,放入元素的线程...

    The java.util.concurrent Synchronizer Framework

    Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范请求(Java Specification Request, JSR)166创建而成...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...

    The java.util.concurrent synchronizer framework.pdf

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

    java并发工具包 java.util.concurrent中文版-带书签版

    8. **Semaphore**:信号量,控制同时访问特定资源的线程数量,用来解决资源争抢问题。 9. **ThreadPoolExecutor**:线程池的具体实现,可以通过配置核心线程数、最大线程数、任务队列等参数来定制线程池的行为。 ...

    java.util.concurrent_您不知道的5件事

    ### Java.util.concurrent_您不知道的5件事 #### 1. Semaphore(信号量) - **定义与作用**:`Semaphore` 类...无论是简单的信号量控制还是复杂的多线程同步逻辑,`java.util.concurrent` 包都能提供合适的解决方案。

    java.util.concurrent介绍(重要).pdf

    - `Semaphore`:信号量,用于限制同时访问特定资源的线程数量。 4. **原子变量类**: - `AtomicInteger`, `AtomicLong` 等:提供原子操作的整数和长整型变量,适用于在多线程环境下实现无锁编程。 5. **锁接口和...

    关于 java.util.concurrent 您不知道的 5 件事,第 2 部分

    在Java编程领域,`java.util.concurrent`包是并发编程的核心工具包,提供了高效、线程安全的类和接口,使得开发者能够更容易地处理多线程环境。本篇将深入探讨这个包中一些鲜为人知的知识点,以帮助你提升并发编程的...

    java Thread & synchronized & concurrent 线程、同步、并发

    Java提供了丰富的并发工具类,如`Semaphore`信号量、`CyclicBarrier`屏障、`CountDownLatch`倒计时器和`Future`未来结果等,它们可以帮助我们设计出更灵活、高效的并发策略。此外,`java.util.concurrent`包下的`...

    java concurrent 包 详细解析

    7. **Semaphore信号量**:用于控制同时访问特定资源的线程数量,通过acquire()和release()方法来获取和释放许可证。 8. **CyclicBarrier和CountDownLatch**:这两个是同步辅助类。CyclicBarrier允许多个线程等待...

    java concurrent 精简源码

    - `Semaphore`:信号量,用于限制同时访问特定资源的线程数量。 - `CountDownLatch`:计数器,常用于多线程协作,让一组线程等待另一组线程完成操作。 - `CyclicBarrier`:循环屏障,允许一组线程等待所有线程...

    工作在同一个java虚拟机中的线程能实现消息互发(alpha)

    3. **信号量(Semaphores)和锁**:`java.util.concurrent.locks`包提供了`Semaphore`和`ReentrantLock`等同步原语,可以用来控制并发访问资源的数量。 4. **条件变量(Condition)**:`java.util.concurrent.locks...

    JAVA多线程--信号量(Semaphore)_.docx

    JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...

    backport-util-concurrent_java_backport_源码.zip

    backport-util-concurrent还包含了其他一些并发工具,如`Semaphore`(信号量)、`CountDownLatch`(倒计数器)和`CyclicBarrier`(循环屏障)。这些工具可以帮助协调多个线程之间的交互,实现复杂的并发控制逻辑。 ...

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    J.U.C系列线程安全的理论讲解编程开发技术共6页.pdf

    1. **`java.util.concurrent`包**:这个包提供了各种并发工具类,如`ExecutorService`、`Future`、`Semaphore`、`CountDownLatch`等,用于管理线程的执行和同步。 - `ExecutorService`是线程池的接口,它允许...

    java的concurrent用法详解

    `Semaphore`是用来控制对资源访问的计数信号量。它可以用来控制多个线程对共享资源的访问数量。 **2.4.4 `Future`与`FutureTask`** `Future`接口代表一个异步计算的结果,可以通过它来获取异步任务的结果。`...

Global site tag (gtag.js) - Google Analytics