介绍:
Semaphore 用于对某一物理或逻辑资源被同一时间访问数量的限制.
实现:
Semaphore 是如何做到对某一物理或逻辑资源访问数量的限制了?
答案是 AQS.
比如我定义:Semaphore(10), 同一时刻只能有 10 个线程访问线程池,每来一个线程,state -1,当第11线程访问的结果是啥了?由于 state < 0 而被阻塞.
当一个线程访问完后,调用 release 方法,state + 1. 然后唤醒等待访问线程池的线程.
注意:
由于 release 方法中,没有对 state < 0 进行判断,每调用一次 release 方法 state + 1. 也就是说:虽然我定义的 state = 10. 但是我调用 11 次 release 方法,那么此时 state = 11.这就完成了
Semaphore 的动态增长.
如果说我觉得10个线程同时访问线程池,线程池扛不住了,我要减少同时访问的数量,该怎么办了?继承 Semaphore 类,重写 reducePermits 方法就好了.
Semaphore 和 CountDownLatch 对比分析
CountDownLatch 是为了共同干一件事,线程1完成A部分,线程2完成B部分,线程3完成C部分. 而 Semaphore 是为了限制同一时间对某一资源访问的数量, 例如:同一时间只允许10个线程同时访问.
分享到:
相关推荐
Java并发系列之Semaphore源码分析 Java并发系列之Semaphore源码分析是Java并发系列中的一篇重要文章,主要为大家详细介绍了Java并发系列之Semaphore源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 ...
源码分析: 1. **Semaphore的架构**:Semaphore可能基于微服务架构,每个功能作为一个独立的服务运行,这样可以确保系统的可扩展性和容错性。 2. **数据库交互**:Semaphore需要与数据库进行交互以存储项目配置、...
《JUC并发编程与源码分析视频课》是一门深入探讨Java并发编程的课程,主要聚焦于Java Util Concurrency(JUC)库的使用和源码解析。JUC是Java平台提供的一组高级并发工具包,它极大地简化了多线程编程,并提供了更...
接下来,我们来具体分析一下AQS的源码。AQS中定义了一个名为state的volatile变量,用于表示同步状态。这个变量有三种操作方法:getstate()、setstate()和compareAndSetState(),分别用于获取、设置和原子性地更新...
这篇博客文章《Java rt.jar 源码分析》可能探讨了以下几个关键知识点: 1. **Java基础类库**:rt.jar中的类库涵盖了Java语言的核心功能,包括对象模型、基本类型、集合框架、多线程、网络编程、I/O流、反射、异常...
"java并发源码分析之实战编程"这个主题深入探讨了Java平台上的并发处理机制,旨在帮助开发者理解并有效地利用这些机制来提高程序性能和可扩展性。在这个专题中,我们将围绕Java并发库、线程管理、锁机制、并发容器...
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
Linux 2.6.9 epoll 系统调用源码分析 Linux 2.6.9 epoll 系统调用源码分析是了解 Linux 操作系统中 epoll 机制的核心组件之一。epoll 机制是 Linux 2.6 及更高版本中的一种高性能 I/O 事件处理机制,它提供了高效、...
本文将详细分析AQS的源码,探讨其工作机制,以及在Java中如何实现不同类型的锁。 首先,我们需要了解锁的基本类型。在Java中,锁主要分为两类:悲观锁和乐观锁。悲观锁认为并发操作会导致数据不一致,因此在操作...
本文将深入浅出地分析Linux 2.6.9版本中epoll系统调用的源码,理解其内部工作机制。 ### 一、相关的数据结构 epoll的核心数据结构主要包括eventpoll、ep_pqueue、epoll_event和epitem等。 #### struct eventpoll ...
Java提供了多种线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Semaphore、CyclicBarrier等高级并发工具。 2. **并发下载策略**:在FlashGet的实现中,关键在于如何有效地分配和管理...
在Java编程世界里,源码分析是提升编程技能和理解框架内部运作机制的关键步骤。"JavaCodeAnalysis"项目正致力于帮助开发者深入理解Java语言及其常用库的底层实现。这个项目包含了一个名为"JavaCodeAnalysis-master...
`multiThread`是一个开源项目,旨在帮助开发者深入理解Java多线程编程,并提供了源码分析、工具实现以及使用样例。这个学习库是学习和实践Java并发编程的理想资源。 1. **Java多线程基础** - Java中的线程是程序...
本文将针对"jdk:jdk源码分析"这一主题,对JDK的核心组件进行详细的剖析。 首先,我们来看看JDK的主要组成部分。JDK包含了JRE(Java Runtime Environment),这是执行Java程序的必备环境;JVM(Java Virtual Machine...
并发编程是多线程环境下的程序设计,它允许在单个处理器或多个处理器上同时执行...CountDownLatch、CyclicBarrier、Semaphore 等工具)。理解这些工具的工作原理和使用场景,能够帮助开发者编写高效且安全的并发程序。
Java并发结合源码分析AQS原理 Java并发编程中,AQS(AbstractQueuedSynchronizer)是一个核心组件,它提供了一个基于FIFO队列和状态变量的基础框架,用于构建锁和其他同步装置。在这篇文章中,我们将深入探讨AQS的...
【标题】"JDK源码分析" 在Java开发领域,深入理解JDK源码是提升技术能力的关键步骤。JDK,即Java Development Kit,是Java编程语言和平台的基础,包含了编译器、运行时环境(JVM)、类库以及各种工具。通过分析JDK...
2. `struct rw_semaphore sem`:读写信号量,用于在`sys_epoll_wait()`收集事件时保持读取状态,在文件清理、`epoll`文件退出代码以及控制操作时保持写入状态,确保在关键操作期间文件不会被意外删除。 3. `wait_...
`javaThread`项目则是一个专门针对Java并发编程进行源码分析的实战手册,它旨在帮助开发者深入理解Java线程的内部机制和并发工具的实现原理。 在Java中,`Thread`类是所有线程的基础,它是Java并发模型的核心。`...
通过源码分析,我们可以更深入地理解如何在实际编程中实现并发控制,避免数据竞争和死锁问题。通过实际的示例代码,你可以看到如何在多线程或多进程环境中使用信号量进行同步,这将对你的Linux系统编程技能大有裨益...