一、概述
在之前学习的synchronized关键字的对象锁与ReentrantLock重入锁都只能允许一个线程获取锁。而Semaphore不同,它可以允许多个线程获取锁访问资源,Semaphore常被运用在限流等应用场景。
二、常用API
构造方法
Semaphore(int permits) : 参数表示许可数量
Semaphore(int permits,boolean fair): 当fair等于true时,设置为公平信号量,默认是非公平的
常用方法
- void acquire() throws InterruptedException:获取一个许可,当许可数量为0的时候,当前线程阻塞,该操作可以响应中断
- void acquireUninterruptibly(int permits) :和acquire(int permits) 方法类似,只是不会响应线程中断
- boolean tryAcquire():尝试获取1个许可,不管是否能够获取成功,都立即返回,true表示获取成功,false表示获取失败
- boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException:尝试在指定的时间内获取1个许可,获取成功返回true,指定的时间过后还是无法获取许可,返回false
- void release():释放一个许可,将其返回给信号量
- int availablePermits():当前可用的许可数
三、案例
1.简单使用
public class Demo1 {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 10; i++) {
Thread t = new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"等待获取许可");
semaphore.acquire();
System.out.println(Thread.currentThread().getName