Java开发笔记(一百零二)信号量的请求与释放

前面介绍了同步与加锁两种并发处理机制,虽然加锁比起同步要灵活一些,但是加锁在某些高级场合依然力有未逮,包括但不限于下列几点:
1、某块代码被加锁之后,对其它线程而言就处于繁忙状态,缺乏弹性的阈值范围;
2、遇到被其它线程加锁的情况,当前线程要么一直等待,要么立即放弃,除了这两种反应之外,没有别的选择了;
3、线程A加锁之后,只能由线程A解锁,要是线程A忘了解锁,那么被锁住的资源将无法释放,从而导致其它线程出现死锁的情况;
有鉴于此,Java又设计了一种信号量工具Semaphore,试图从根本上解决加锁机制的不足之处。所谓信号量关键在于数量的量,它里面保存的是许可证,并且许可证的数量还不止一个,这意味着有几个许可证,就允许几个线程一起处理。比如某个停车场有五个停车位,每辆汽车停进来都会占据一个停车位;相对应的,停车场每开出一辆汽车,都会释放一个停车位,空出来的停车位可以留给下一辆汽车停泊。把停车业务抽象为信号量机制,相当于某个信号量拥有五个许可证,每个停车线程在处理过程中都会占据一个许可证,那么该信号量便允许五个停车线程同时进行处理,此时再来第六个线程的话才需要在旁边等待,直到五个停车线程的其中之一释放自己占据的许可证之后,第六个线程再获得空出来的许可证并往下处理。
信号量还支持多种请求许可证的方式,用以满足丰富多样的业务需求,常见的许可证请求方式主要有以下四种:
1、坚持请求从信号量中获得许可证,即使收到线程中断信号也不放弃;如果信号量无空闲许可证,那么愿意继续等待直到获得许可证。该方式调用的是信号量的acquireUninterruptibly方法。
2、尝试从信号量中获得许可证,但只愿意等待有限的时间;要是等待时长超过规定时间,那就不再等待,放弃获得许可证。该方式调用的是信号量的tryAcquire方法(注意是带时间参数的同名方法),该方法返回true表示在等待期间获得了许可证,返回false表示因超时放弃了等待。
3、尝试从信号量中立即获得许可证,哪怕一丁点时间都不愿意等待。该方式调用的是信号量的tryAcquire方法(注意是不带参数的同名方法),该方法返回true表示得到了许可证,返回false表示没得到许可证。
4、请求从信号量中获得许可证,如果信号量无空闲许可证,那么愿意继续等待,但在等待期间允许接收中断信号。该方式调用的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值