Java多线程通信-Semaphore(信号量)

一、semaphone 信号量

  Semaphone (信号量)是一个同步工具类、用来控制同时访问某个资源的线程数量,还可以用来实现某些资源池、或者给容器添加边界。
  Semaphone管理着一组“虚拟”的许可(permit),许可的初始数量可通过构造函数来指定。操作之前可以先获得许可,并在操作结束之后释放许可。
acquire方法需要消耗一个许可,如果没有许可acquire将阻塞直到有许可(除非被中断、或者超时)可用。release方法则会添加一个许可。这里的许可,是一个虚拟的概念,并不存在一个名为“Permit"的对象,Semaphore只是记录可用的许可数量并执行相应的操作。

这里有两点需要注意:

  1. release会创建一个许可添加到信号量中,Semaphore中的许可数量并不受限于初始值,也就是说可以在Semaphore构造函数之后,调用release(int)增加许可数量。
  2. 如果一个线程因为没有许可而阻塞,在等待过程中被中断,accquire方法会抛出InterruptedException异常,并且清除中断状态、

Semaphore主要方法

方法 说明
void acquire() 消耗一个许可,无许可可用则阻塞,直到许可可用或者线程被中断
void acquire(int) 消耗多个许可,无足够许可则阻塞、直到有足够的许可可用或者被中断
void acquireUninterruptibly() 消耗一个许可 ,无许可则阻塞,并且线程被中断时会继续等待,
当该方法返回时,线程中标志会重置
void acquireUninterruptibly(int) 消耗多个许可 ,无许可则阻塞,并且线程被中断时会继续等待,
当该方法返回时,线程中标志会重置
boolean tryAcquire() 尝试获取一个许可,该方法不会阻塞,有许可则立即返回true,无许可则立即返回false。
即使在公平模式
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值