`
uule
  • 浏览: 6350284 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Semaphore 并发个数控制

 
阅读更多

 

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控制多线程循序执行

    在实际应用中,Semaphore常用于控制并发程度,如限制数据库连接池的并发连接数,或者限制同一时间处理HTTP请求的数量等。通过合理使用Semaphore,我们可以有效地避免资源竞争,提高程序的并发性能,并确保多线程环境...

    python多线程semaphore实现线程数控制的示例

    为了有效地控制并发线程的数量,我们可以使用Semaphore(信号量)机制。Semaphore 是一种同步原语,它用于限制同时访问特定资源的线程数量。 在Python中,`threading.Semaphore` 是内置的线程同步类,它提供了获取...

    并发控制艺术:掌握CountDownLatch与Semaphore

    Semaphore(信号量)是一种广泛应用于控制对特定资源的线程访问数的工具。它基于许可的概念,允许多个线程在限制下同时访问资源,非常适合于实现资源池或限流机制。例如,在Hystrix的限流实现中就有基于信号量的方法...

    C#语言Semaphore类用法实例(多线程多端口使用端口控制)

    在C#编程中,Semaphore类是线程同步和并发控制的重要工具,主要用于限制对特定资源的并发访问。在这个实例中,我们关注的是如何利用Semaphore来管理多线程对多个端口的访问,确保不会出现冲突。Semaphore类可以看作...

    CsGo并发流程控制框架

    多线程是并发控制的基础,它允许一个应用程序同时执行多个独立的代码段。在CsGo框架中,可以使用`System.Threading.Thread`类创建和管理线程。每个线程都有自己的调用堆栈和执行上下文,使得多个任务可以并行运行,...

    semaphore:并发控制咖喱功能

    在JavaScript中,虽然它不是内置的原生特性,但开发者可以利用异步编程库或设计模式来模拟信号量的行为,实现并发控制,特别是在处理咖喱(Currying)功能时。 **什么是咖喱功能(Currying)**: 咖喱化是函数式...

    java并发核心Semaphore 的使用思路.docx

    在Java的`java.util.concurrent`包中,Semaphore类提供了对多个线程并发访问控制的能力,允许我们设置一个固定的许可证数量。当线程需要访问受Semaphore保护的资源时,它必须先获取一个许可证;如果当前没有可用的...

    CountDownLatch、Semaphore等4大并发工具类详解

    Semaphore 是一个限流工具类,用于控制访问某个资源的线程数量。它可以限制某个资源的并发访问数量,防止资源被过度访问。Semaphore 提供了 acquire() 和 release() 两个方法,acquire() 方法用于获取资源,release...

    Swift-dispatch-semaphore

    初始化一个`DispatchSemaphore`时,需要指定一个初始值,这个值表示可以并发执行的任务数量。当一个任务开始执行时,信号量值会减一;任务完成后,信号量值会加一。如果信号量值为0,其他试图获取信号量的任务将会被...

    Semaphore 源码解析

    Semaphore是Java并发编程中的一种重要工具,主要用于控制并发线程的访问权限,实现限流或资源的互斥访问。在高并发场景下,Semaphore能够有效地防止过多的线程同时访问共享资源,从而避免系统资源耗尽,提高系统性能...

    并发控制实现方法的比较研究

    并发控制技术的实现通常依赖于底层的同步机制,这些同步机制主要包括但不限于事件(Event)、互斥锁(Mutex)、条件变量(Condition Variable)、信号量(Semaphore)、读写锁(RWLock)以及自旋锁(Spinlock)等。不同的数据库...

    java并发工具类(CountDownLatch+Semaphore+Exchanger)

    在实际应用中,这三个工具类可以灵活组合使用,以满足复杂的并发控制需求。例如,CountDownLatch可以用于确保所有参与者准备好后再开始一个活动,Semaphore可以限制并发访问特定资源的线程数量,而Exchanger则可以在...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...

    并发编程之Tools&CountDownLatch&Semaphore原理与应用1

    Semaphore,顾名思义,是一个信号量,它用于控制对共享资源的访问权限。Semaphore维护了一个许可计数,当计数大于0时,线程可以获取一个许可并继续执行;当计数为0时,线程会被阻塞,直到其他线程释放许可。...

    Semaphore进程间通讯测试源码

    开发者可能会看到如何在多线程或跨进程的环境下,通过Semaphore控制资源的并发访问,防止数据竞争和死锁等问题。通过学习这个源码,可以深入理解Semaphore的工作原理以及在实际应用中的使用方法,这对于开发需要进程...

    pthread.h sched.h semaphore.h 三个头文件

    3. **semaphore.h**: 这个头文件包含了信号量的相关定义,信号量是一种经典的同步机制,用于控制对共享资源的访问。它提供了一种限制并发访问和解决资源争抢的方法。在多线程或进程环境中,信号量可以通过`sem_open...

    Java中的Semaphore:深入理解与应用实践

    在Java的并发编程中,Semaphore 是一个非常重要的同步辅助类,它用于控制对共享资源的访问。Semaphore 通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和潜在的性能问题。本文将详细介绍 ...

    java线程并发semaphore类示例

    在Java多线程编程中,线程的并发控制是非常关键的一部分,它确保多个线程能够协同工作并有效地访问共享资源。Java 5.0引入了四个新的同步工具类,它们是Semaphore、CountDownLatch、CyclicBarrier和Exchanger,用于...

    pc_semaphore.zip_pc_semaphore

    读者-写者问题是一个经典的并发控制问题,它描述了多个读者可以同时读取一个共享数据,但只有一个写者可以写入数据的情况。在不使用任何同步机制的情况下,读者和写者可能会导致数据的混乱。例如,当一个写者正在...

    mutex和semaphore互斥程序实例

    例如,使用`std::binary_semaphore`实现一个允许两个线程并发访问的资源池: ```cpp #include #include #include &lt;semaphore&gt; std::binary_semaphore sem(2); // 初始化为2,允许两个线程同时访问 void access_...

Global site tag (gtag.js) - Google Analytics