《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
相关推荐
15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...
信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...
2. **Semaphore**:信号量,用于限制同时访问特定资源的线程数量。 3. **BlockingQueue**:阻塞队列,线程安全的数据结构,当队列为空时,取元素的线程会被阻塞,直到有元素放入;反之,当队列满时,放入元素的线程...
Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范请求(Java Specification Request, JSR)166创建而成...
15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...
文档明确指出,Doug Lea为J2SE 5.0引入的java.util.concurrent包提供了一套精巧的同步器框架,这套框架极大地简化了并发控制的实现,并且在多个领域提供了高效的同步原语,如锁、条件变量、信号量、事件标志等。...
8. **Semaphore**:信号量,控制同时访问特定资源的线程数量,用来解决资源争抢问题。 9. **ThreadPoolExecutor**:线程池的具体实现,可以通过配置核心线程数、最大线程数、任务队列等参数来定制线程池的行为。 ...
### Java.util.concurrent_您不知道的5件事 #### 1. Semaphore(信号量) - **定义与作用**:`Semaphore` 类...无论是简单的信号量控制还是复杂的多线程同步逻辑,`java.util.concurrent` 包都能提供合适的解决方案。
- `Semaphore`:信号量,用于限制同时访问特定资源的线程数量。 4. **原子变量类**: - `AtomicInteger`, `AtomicLong` 等:提供原子操作的整数和长整型变量,适用于在多线程环境下实现无锁编程。 5. **锁接口和...
在Java编程领域,`java.util.concurrent`包是并发编程的核心工具包,提供了高效、线程安全的类和接口,使得开发者能够更容易地处理多线程环境。本篇将深入探讨这个包中一些鲜为人知的知识点,以帮助你提升并发编程的...
Java提供了丰富的并发工具类,如`Semaphore`信号量、`CyclicBarrier`屏障、`CountDownLatch`倒计时器和`Future`未来结果等,它们可以帮助我们设计出更灵活、高效的并发策略。此外,`java.util.concurrent`包下的`...
7. **Semaphore信号量**:用于控制同时访问特定资源的线程数量,通过acquire()和release()方法来获取和释放许可证。 8. **CyclicBarrier和CountDownLatch**:这两个是同步辅助类。CyclicBarrier允许多个线程等待...
- `Semaphore`:信号量,用于限制同时访问特定资源的线程数量。 - `CountDownLatch`:计数器,常用于多线程协作,让一组线程等待另一组线程完成操作。 - `CyclicBarrier`:循环屏障,允许一组线程等待所有线程...
3. **信号量(Semaphores)和锁**:`java.util.concurrent.locks`包提供了`Semaphore`和`ReentrantLock`等同步原语,可以用来控制并发访问资源的数量。 4. **条件变量(Condition)**:`java.util.concurrent.locks...
JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...
backport-util-concurrent还包含了其他一些并发工具,如`Semaphore`(信号量)、`CountDownLatch`(倒计数器)和`CyclicBarrier`(循环屏障)。这些工具可以帮助协调多个线程之间的交互,实现复杂的并发控制逻辑。 ...
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
1. **`java.util.concurrent`包**:这个包提供了各种并发工具类,如`ExecutorService`、`Future`、`Semaphore`、`CountDownLatch`等,用于管理线程的执行和同步。 - `ExecutorService`是线程池的接口,它允许...
`Semaphore`是用来控制对资源访问的计数信号量。它可以用来控制多个线程对共享资源的访问数量。 **2.4.4 `Future`与`FutureTask`** `Future`接口代表一个异步计算的结果,可以通过它来获取异步任务的结果。`...