java.util.concurrent.Semaphore之源码分析

Semaphore是一个计数信号量。Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待(可以设置等待时长),而 release() 释放一个许可。

Semaphore实现的功能:比如我们去餐馆吃饭,如果该餐馆总共有十张桌子,但是吃饭的人有20波,那么先来的就占用了桌子吃饭,后来的只能等待,当任何一张桌子的人走开,那么其他等待的10波人就随机有1波人占用这张桌子,当然也可能按照顺序来,主要看采用FairSync还是NonfairSync。

 

Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。

网上找的构造方法和方法的说明:

 

构造方法摘要
Semaphore(int permits)
          创建具有给定的许可数和非公平的公平设置的 Semaphore
Semaphore(int permits, boolean fair)
          创建具有给定的许可数和给定的公平设置的 Semaphore

 

方法摘要
 voidacquire()
          从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
 voidacquire(int permits)
          从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,或者线程已被中断。
 voidacquireUninterruptibly()
          从此信号量中获取许可,在有可用的许可前将其阻塞。
 voidacquireUninterruptibly(int permits)
          从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。
 intavailablePermits()
          返回此信号量中当前可用的许可数。
 intdrainPermits()
          获取并返回立即可用的所有许可。
protected  Collection<Thread>getQueuedThreads()
          返回一个 collection,包含可能等待获取的线程。
 intgetQueueLength()
          返回正在等待获取的线程的估计数目。
 booleanhasQueuedThreads()
          查询是否有线程正在等待获取。
 booleanisFair()
          如果此信号量的公平设置为 true,则返回 true
protected  voidreducePermits(int reduction)
          根据指定的缩减量减小可用许可的数目。
 voidrelease()
          释放一个许可,将其返回给信号量。
 voidrelease(int permits)
          释放给定数目的许可,将其返回到信号量。
 StringtoString()
          返回标识此信号量的字符串,以及信号量的状态。
 booleantryAcquire()
          仅在调用时此信号量存在一个可用许可,才从信号量获取许可。
 booleantryAcquire(int permits)
          仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。
 booleantryAcquire(int permits, long timeout, TimeUnit unit)
          如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被中断,则从此信号量获取给定数目的许可。
 booleantryAcquire(long timeout, TimeUnit unit)
          如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值