Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
另外重入锁ReentrantLock也可以实现该功能,但实现上代码也要复杂些。
SemaPhore,一个信号量对象,可以定义信号量的个数,通过该信号量控制线程同步的数量。例如我们只允许同步三个线程进入共享资源,其它线程都阻塞。
好比,厕所有三个坑,十个人进去,每次只能进去三个。采用信号灯来实现。
其优势为可以被其它线程唤醒,如果使用互斥锁,那么一旦出现异常,该锁将不会释放,该锁只能由自己释放。比如:一个人上厕所,如果采用互斥锁,那么当该人晕倒在厕所时,这个厕所就不能被使用了。如果使用信号灯互斥,那么能够找到物业人员打开厕所,救人并接着使用。
//构造方法摘要 Semaphore(int permits) //创建具有给定的许可数和非公平的公平设置的 Semaphore。 Semaphore(int permits, boolean fair) //创建具有给定的许可数和给定的公平设置的 Semaphore。
下面的Demo,启动7个线程,每次只让三个线程工作,其它线程阻塞。三个线程的工作时间为一个10000以内的随机数。
package tags; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class TestSemaphore { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore sp = new Semaphore(3); // 模拟10个客户端访问 for (int index = 0; index < 7; index++) { Runnable rb = new Runnable() { public void run() { try { sp.acquire(); // 获取许可 System.out.println("线程" + Thread.currentThread().getName() + "进入,当前已有" + (3-sp.availablePermits()) + "个并发"); //availablePermits() 返回此信号量中当前可用的许可数。 Thread.sleep((long) (Math.random() * 10000)); System.out.println("线程" + Thread.currentThread().getName() + "即将离开"); sp.release();// 访问完后,释放 System.out.println("线程" + Thread.currentThread().getName() + "已离开,当前有" + (3-sp.availablePermits()) + "个并发"); } catch (InterruptedException e) { } } }; exec.execute(rb); } // 退出线程池 exec.shutdown(); } }
结果:
线程pool-1-thread-2进入,当前已有2个并发
线程pool-1-thread-3进入,当前已有3个并发
线程pool-1-thread-1进入,当前已有2个并发
线程pool-1-thread-3即将离开
线程pool-1-thread-4进入,当前已有3个并发
线程pool-1-thread-3已离开,当前有3个并发
线程pool-1-thread-2即将离开
线程pool-1-thread-2已离开,当前有2个并发
线程pool-1-thread-7进入,当前已有3个并发
线程pool-1-thread-1即将离开
线程pool-1-thread-5进入,当前已有3个并发
线程pool-1-thread-1已离开,当前有3个并发
线程pool-1-thread-4即将离开
线程pool-1-thread-4已离开,当前有2个并发
线程pool-1-thread-6进入,当前已有3个并发
线程pool-1-thread-7即将离开
线程pool-1-thread-7已离开,当前有2个并发
线程pool-1-thread-6即将离开
线程pool-1-thread-6已离开,当前有1个并发
线程pool-1-thread-5即将离开
线程pool-1-thread-5已离开,当前有0个并发
参考:http://blog.csdn.net/lb85858585/article/details/7273561
JDK:http://www.cjsdn.net/doc/jdk50/java/util/concurrent/Semaphore.html#availablePermits()
相关推荐
在实际应用中,Semaphore常用于控制并发程度,如限制数据库连接池的并发连接数,或者限制同一时间处理HTTP请求的数量等。通过合理使用Semaphore,我们可以有效地避免资源竞争,提高程序的并发性能,并确保多线程环境...
为了有效地控制并发线程的数量,我们可以使用Semaphore(信号量)机制。Semaphore 是一种同步原语,它用于限制同时访问特定资源的线程数量。 在Python中,`threading.Semaphore` 是内置的线程同步类,它提供了获取...
Semaphore(信号量)是一种广泛应用于控制对特定资源的线程访问数的工具。它基于许可的概念,允许多个线程在限制下同时访问资源,非常适合于实现资源池或限流机制。例如,在Hystrix的限流实现中就有基于信号量的方法...
在C#编程中,Semaphore类是线程同步和并发控制的重要工具,主要用于限制对特定资源的并发访问。在这个实例中,我们关注的是如何利用Semaphore来管理多线程对多个端口的访问,确保不会出现冲突。Semaphore类可以看作...
多线程是并发控制的基础,它允许一个应用程序同时执行多个独立的代码段。在CsGo框架中,可以使用`System.Threading.Thread`类创建和管理线程。每个线程都有自己的调用堆栈和执行上下文,使得多个任务可以并行运行,...
在JavaScript中,虽然它不是内置的原生特性,但开发者可以利用异步编程库或设计模式来模拟信号量的行为,实现并发控制,特别是在处理咖喱(Currying)功能时。 **什么是咖喱功能(Currying)**: 咖喱化是函数式...
在Java的`java.util.concurrent`包中,Semaphore类提供了对多个线程并发访问控制的能力,允许我们设置一个固定的许可证数量。当线程需要访问受Semaphore保护的资源时,它必须先获取一个许可证;如果当前没有可用的...
Semaphore 是一个限流工具类,用于控制访问某个资源的线程数量。它可以限制某个资源的并发访问数量,防止资源被过度访问。Semaphore 提供了 acquire() 和 release() 两个方法,acquire() 方法用于获取资源,release...
初始化一个`DispatchSemaphore`时,需要指定一个初始值,这个值表示可以并发执行的任务数量。当一个任务开始执行时,信号量值会减一;任务完成后,信号量值会加一。如果信号量值为0,其他试图获取信号量的任务将会被...
Semaphore是Java并发编程中的一种重要工具,主要用于控制并发线程的访问权限,实现限流或资源的互斥访问。在高并发场景下,Semaphore能够有效地防止过多的线程同时访问共享资源,从而避免系统资源耗尽,提高系统性能...
并发控制技术的实现通常依赖于底层的同步机制,这些同步机制主要包括但不限于事件(Event)、互斥锁(Mutex)、条件变量(Condition Variable)、信号量(Semaphore)、读写锁(RWLock)以及自旋锁(Spinlock)等。不同的数据库...
在实际应用中,这三个工具类可以灵活组合使用,以满足复杂的并发控制需求。例如,CountDownLatch可以用于确保所有参与者准备好后再开始一个活动,Semaphore可以限制并发访问特定资源的线程数量,而Exchanger则可以在...
在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...
Semaphore,顾名思义,是一个信号量,它用于控制对共享资源的访问权限。Semaphore维护了一个许可计数,当计数大于0时,线程可以获取一个许可并继续执行;当计数为0时,线程会被阻塞,直到其他线程释放许可。...
开发者可能会看到如何在多线程或跨进程的环境下,通过Semaphore控制资源的并发访问,防止数据竞争和死锁等问题。通过学习这个源码,可以深入理解Semaphore的工作原理以及在实际应用中的使用方法,这对于开发需要进程...
3. **semaphore.h**: 这个头文件包含了信号量的相关定义,信号量是一种经典的同步机制,用于控制对共享资源的访问。它提供了一种限制并发访问和解决资源争抢的方法。在多线程或进程环境中,信号量可以通过`sem_open...
在Java的并发编程中,Semaphore 是一个非常重要的同步辅助类,它用于控制对共享资源的访问。Semaphore 通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和潜在的性能问题。本文将详细介绍 ...
在Java多线程编程中,线程的并发控制是非常关键的一部分,它确保多个线程能够协同工作并有效地访问共享资源。Java 5.0引入了四个新的同步工具类,它们是Semaphore、CountDownLatch、CyclicBarrier和Exchanger,用于...
读者-写者问题是一个经典的并发控制问题,它描述了多个读者可以同时读取一个共享数据,但只有一个写者可以写入数据的情况。在不使用任何同步机制的情况下,读者和写者可能会导致数据的混乱。例如,当一个写者正在...
例如,使用`std::binary_semaphore`实现一个允许两个线程并发访问的资源池: ```cpp #include #include #include <semaphore> std::binary_semaphore sem(2); // 初始化为2,允许两个线程同时访问 void access_...