1、信号量
Semaphore 是JDK1.5的 java.util.concurrent 并发包中提供的一个并发工具类。
所谓 Semaphore 即 信号量 的意思。
这个叫法并不能很好地表示它的作用,更形象的说法应该是 许可证管理器 。
Semaphore 是一个计数信号量。
从概念上将,Semaphore 包含一组许可证。
如果有需要的话,每个 acquire() 方法都会阻塞,直到获取一个可用的许可证。
每个 release() 方法都会释放持有许可证的线程,并且归还 Semaphore 一个可用的许可证。
然而,实际上并没有真实的许可证对象供线程使用,Semaphore 只是对可用的数量进行管理维护。
2、场景:某高级会所迎接贵宾
// 信号量机制
public class SemaphoreDemo {
public static void main(String[] args) {
SemaphoreDemo semaphoreTest = new SemaphoreDemo();
int N = 8; // 客人数量
Semaphore semaphore = new Semaphore(5 ); // 手牌数量,限制请求数量
for (int i = 0; i < N; i++) {
String vipNo = "vip-00" + i;
new Thread(() -> {
try {
semaphore.acquire(); // 获取令牌
semaphoreTest.service(vipNo);
semaphore.release(); // 释放令牌
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
// 限流 控制5个线程 同时访问
public void service(String vipNo) throws InterruptedException {
System.out.println("楼上出来迎接贵宾一位,贵宾编号" + vipNo + ",...");
Thread.sleep(new Random().nextInt(3000));
System.out.println("欢送贵宾出门,贵宾编号" + vipNo);
}
}
信号量,控制多个线程争抢许可。
acquire:获取一个许可,如果没有则等待。
release:释放一个许可。
典型场景:
代码并发处理限流;