Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以
保证合理的使用公共资源。
1. 应用场景
Semaphore可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假
如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程
并发地读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这
时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连
接。这个时候,就可以使用Semaphore来做流量控制
2. 示例
public static void main(String[] args) throws Exception {
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i< 20; i++) {
new Thread( ()-> {
try {
semaphore.acquire();
log.info("线程: {} 开始执行", Thread.currentThread().getName());
Thread.sleep(2000);
log.info("线程: {} 执行结束", Thread.currentThread().getName());
semaphore.release();
} catch (Exception e) {}
}, "线程" + i).start();
}
}
打印结果如下图:
image.png