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