SemaphoreDemo案例

Semaphore 是 Java 并发包中的一种同步工具,它主要用于控制同时访问特定资源或执行特定操作的线程数量。以下是 Semaphore 的主要作用和特点:

  1. 控制并发线程数量: Semaphore 可以限制同时访问某一资源或执行某一操作的线程数量,通过设置信号量的计数器来实现控制。

  2. 资源池的控制: 可以用于实现对象池、连接池等场景,限制池中资源的并发访问数量。

  3. 保护共享资源: 可以保护共享资源不被多个线程同时访问,从而避免竞态条件和数据不一致性问题。

  4. 实现互斥访问: 类似于锁的功能,但比锁更灵活,可以控制多个线程同时访问某个资源的数量。

  5. 实现公平性: Semaphore 可以选择是否公平地分配许可,即先请求许可的线程将获得许可的优先权。

在使用 Semaphore 时,主要涉及到两个核心方法:

  • acquire():请求一个许可,如果没有许可可用,则阻塞直到有许可可用。
  • release():释放一个许可,使其可供其他线程使用。

通过初始化 Semaphore 实例时设定的许可数量,可以控制同时允许多少个线程执行关键代码段或访问关键资源。当许可数量为 1 时,Semaphore 的行为类似于互斥锁(Mutex),允许只有一个线程访问临界区;当许可数量大于 1 时,多个线程可以同时访问临界区,但受许可数量的限制。

下面举一个关于停车场的例子,当有车离开时,会有另一辆车抢到位置

import java.util.concurrent.Semaphore; 
import java.util.concurrent.TimeUnit; 
public class SemaphoreDemo { 
	public static void main(String[] args) { 
		Semaphore semaphore = new Semaphore(2); 
		for (int i = 0; i < 10; i++) { 
			Thread t = new Thread(() -> { 
				try { 
					semaphore.acquire(); 
				} catch (InterruptedException e) { 
					e.printStackTrace();
	 	    	} 
				System.out.println(Thread.currentThread().getName() + " : 抢到位置"); 
				try { 
					TimeUnit.SECONDS.sleep(5); 
				} catch (InterruptedException e) { 
					e.printStackTrace(); 
				} 
				semaphore.release(); 
				System.out.println(Thread.currentThread().getName() + " : 离开位置"); 
			});
	 		t.start(); 
		} 
	} 
} 

感谢您的阅读!有任何疑问,欢迎联系我
714321862@qq.com

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小江小河点、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值