AQS之Semaphore(学习笔记)

转载:https://blog.csdn.net/xiaojin21cen/article/details/87376212

1.介绍

Semaphore 是一个计数信号量。

  • 从概念上将,Semaphore 包含一组许可证。
  • 如果有需要的话,每个 acquire() 方法都会阻塞,直到获取一个可用的许可证。
  • 每个 release() 方法都会释放持有许可证的线程,并且归还 Semaphore 一个可用的许可证。
  • 然而,实际上并没有真实的许可证对象供线程使用,Semaphore 只是对可用的数量进行管理维护。

2.Semaphore 方法说明

2.1、构造函数

Semaphore(permits)   
Semaphore(permits,fair)

permits:初始化许可证数量
fair:是否公平模式

2.2、方法

  • 1、 isFair()
    是否公平模式 FIFO

  • 2、availablePermits()
    获取当前可用的许可证数量

  • 3、acquire()acquire(permits)
    当前线程尝试去阻塞的获取 permits 个许可证。( permits >= 1)
    此过程是阻塞的,它会一直等待许可证,直到发生以下任意一件事:

    • 当前线程获取了n个可用的许可证,则会停止等待,继续执行。
    • 当前线程被中断,则会抛出 InterruptedException 异常,并停止等待,继续执行。
  • 4、acquierUninterruptibly()acquireUninterruptibly(permits)
    当前线程尝试去阻塞的获取 permits 个许可证。 ( permits >= 1)
    此过程是阻塞的,它会一直等待许可证,直到发生以下任意一件事:

    • 当前线程获取了n个可用的许可证,则会停止等待,继续执行。
  • 5、tryAcquire()tryAcquire(permits) 、
    当前线程尝试去获取 permits个许可证。
    此过程是非阻塞的,它只是在方法调用时进行一次尝试。

    • 如果当前线程获取了 permits 个可用的许可证,则会停止等待,继续执行,并返回 true。
    • 如果当前线程没有获得 permits 个许可证,也会停止等待,继续执行,并返回 false 。
  • 6、tryAcquire(timeout,TimeUnit)tryAcquire(permits,timeout,TimeUnit)
    当前线程在限定时间内,阻塞的尝试去获取 permits 个许可证。
    此过程是阻塞的,它会一直等待许可证,直到发生以下任意一件事:

    • 当前线程获取了可用的 permits 个许可证,则会停止等待,继续执行,并返回true。
    • 当前线程等待时间 timeout 超时,则会停止等待,继续执行,并返回false。
    • 当前线程在 timeout 时间内被中断,则会抛出 InterruptedException 一次,并停止等待,继续执行。
  • 7、release()release(permits)
    当前线程释放 permits 个可用的许可证 。( permits >= 1)

  • 8、drainPermits()
    当前线程获得剩余的所有可用许可证

  • 9、hasQueuedThreads()
    判断当前 Semaphore 对象上是否存在正在等待许可证的线程

  • 10、getQueueLength()
    获取当前 Semaphore 对象 上是正在等待许可证的线程数量

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值