06.Java并发编程之Semaphore基础学习
文章转自:https://juejin.im/post/6844903635751534606
概述
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,通过协调各个线程以保证合理地使用公共资源。Semaphore可以用作流量控制,特别是公共资源有限的应用场景,比如数据库的连接。
Semaphore主要用于管理信号量,同样在创建Semaphore对象实例的时候通过传入构造参数设定可供管理的信号量的数值。
简单说,信号量管理的信号就好比令牌,构造时传入令牌数量,也就是Semaphore控制并发的数量。
线程在执行并发的代码前要先获取信号(通过aquire函数获取信号许可),执行后归还信号(通过release方法归还),每次acquire信号成功后,Semaphore可用的信号量就会减一,同样release成功之后,Semaphore可用信号量的数目会加一,如果信号量的数量减为0,acquire调用就会阻塞,直到release调用释放信号后,aquire才会获得信号返回。
使用方法
一个应用程序要读取几万个文件的数据,由于都是IO密集型任务,所以可以启动几十个(例如10)个线程并发地读取。读取到内存中后还要将数据存储到数据库,但是数据库的连接只有3个。此时就必须设置策略控制只有10个线程同时获取数据库连接并保存数据,否则会报错,无法连接到数据库,这时Semaphore就派上用场了,用它来做流量控制,即连接到数据库的线程数。
一个例子:一个应用程序要读取几万个文件的数据,由于都是IO密集型任务,所以可以启动几十个(例如10)个线程并发地读取。读取到内存中后还要将数据存储到数据库,但是数据库的连接只有3个。此时就必须设置策略控制只有10个线程同时获取数据库连接并保存数据,否则会报错,无法连接到数据库,这时Semaphore就派上用场了,用它来做流量控制,即连接到数据库的线程数。
本例中有限的公共资源是数据库连接。Java实现如下:
1 | import java.util.concurrent.ExecutorService; |