java多线程同步工具之Semaphore信号灯

Semaphore是Java中的一种多线程同步工具,用于控制并发访问资源的数量。它能维护当前线程计数,并提供acquire()用于获取信号灯,release()用于释放,以及availablePermits()查询可用信号灯数量。通过Semaphore,可以实现类似限制同时访问特定资源的场景,如限制并发线程数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的个数。举一个通俗的例子:厕所里有5个坑,加入有十个人要上厕所,那么同时只能有5个人能够占用,当这5个人中的任何一个人用完之后,等待的5个人中又有一个人可以占用。


方法:

acquire():霸占一个信号灯。

availablePermits():获取可以提供的信号灯。

release():释放信号灯。


案例:

public class SemaphoreTest {

	public static void main(String[] args) {

		/*创建一个线程池*/
		ExecutorService executorService = Executors.newCachedThreadPool();
		/*创建一个信号灯对象【初始化3个灯】*/
		final Semaphore semaphore = new Semaphore(3);
		
		for (int i=0; i<10;i++){
			
			Runnable runnable = new Runnable() {
				
				@Override
				public void run() {
				/*************获取一个信号灯************/
					try {
						semaphore.acquire();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println(Thread.currentThread().getName() +", 进入,当前已有 " + (3 - semaphore.availablePermits()) +"并发");
					
				/************休眠******************/
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				/**************释放信号灯*************/	
					System.out.println(Thread.currentThread().getName() +"即将离开");
					
					semaphore.release();//释放信号灯
					System.out.println(Thread.currentThread().getName() +", 已离开,当前还有 " + (3 - semaphore.availablePermits()) +"并发");
					
				}
			};
			
			/*执行*/
			executorService.execute(runnable);
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值