Java中的Semaphore信號量詳解
1、介紹
Semaphore(信號量)是用來控制同時訪問特定資源的線程數(shù)量,通過協(xié)調各個線程以保證合理地使用公共資源。
Semaphore通過使用計數(shù)器來控制對共享資源的訪問。 如果計數(shù)器大于0,則允許訪問。
如果為0,則拒絕訪問。 計數(shù)器所計數(shù)的是允許訪問共享資源的許可。 因此,要訪問資源,必須從信號量中授予線程許可。
2、主要方法
- void acquire() :從信號量獲取一個許可,如果無可用許可前將一直阻塞等待,
- void acquire(int permits) :獲取指定數(shù)目的許可,如果無可用許可前也將會一直阻塞等待
- boolean tryAcquire():從信號量嘗試獲取一個許可,如果無可用許可,直接返回false,不會阻塞
- boolean tryAcquire(int permits): 嘗試獲取指定數(shù)目的許可,如果無可用許可直接返回false
- boolean tryAcquire(int permits, long timeout, TimeUnit unit): 在指定的時間內嘗試從信號量中獲取許可,如果在指定的時間內獲取成功,返回true,否則返回false
- void release():釋放一個許可,別忘了在finally中使用,注意:多次調用該方法,會使信號量的許可數(shù)增加,達到動態(tài)擴展的效果,如:初始permits為1,調用了兩次release,最大許可會改變?yōu)?
- int availablePermits(): 獲取當前信號量可用的許可
Semaphore構造函數(shù)
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
- permits 初始許可數(shù),也就是最大訪問線程數(shù)
- fair 當設置為false時,創(chuàng)建的信號量為非公平鎖;當設置為true時,信號量是公平鎖
3、Semaphore登錄限流示例
在以下示例中,實現(xiàn)一個簡單的登錄隊列,通過Semaphore來限制系統(tǒng)中的用戶數(shù):
public static void main(String[] args) {
//允許最大的登錄數(shù)
int slots=10;
ExecutorService executorService = Executors.newFixedThreadPool(slots);
LoginQueueUsingSemaphore loginQueue = new LoginQueueUsingSemaphore(slots);
//線程池模擬登錄
for (int i = 1; i <= slots; i++) {
final int num=i;
executorService.execute(()->{
if (loginQueue.tryLogin()){
System.out.println("用戶:"+num+"登錄成功!");
}else {
System.out.println("用戶:"+num+"登錄失敗!");
}
});
}
executorService.shutdown();
System.out.println("當前可用許可證數(shù):"+loginQueue.availableSlots());
//此時已經登錄了10個用戶,再次登錄的時候會返回false
if (loginQueue.tryLogin()){
System.out.println("登錄成功!");
}else {
System.out.println("系統(tǒng)登錄用戶已滿,登錄失??!");
}
//有用戶退出登錄
loginQueue.logout();
//再次登錄
if (loginQueue.tryLogin()){
System.out.println("登錄成功!");
}else {
System.out.println("系統(tǒng)登錄用戶已滿,登錄失??!");
}
}class LoginQueueUsingSemaphore{
private Semaphore semaphore;
/**
*
* @param slotLimit
*/
public LoginQueueUsingSemaphore(int slotLimit){
semaphore=new Semaphore(slotLimit);
}
boolean tryLogin() {
//獲取一個憑證
return semaphore.tryAcquire();
}
void logout() {
semaphore.release();
}
int availableSlots() {
return semaphore.availablePermits();
}
}
運行結果:

到此這篇關于Java中的Semaphore信號量詳解的文章就介紹到這了,更多相關Semaphore信號量內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)企業(yè)發(fā)放的獎金根據利潤提成問題
這篇文章主要介紹了請利用數(shù)軸來分界,定位。注意定義時需把獎金定義成長整型,需要的朋友可以參考下2017-02-02
mybatis-plus使用generator實現(xiàn)逆向工程
mybatis-plus-generator在3.5.0以及以后的版本使用新的方式逆向生成代碼,本文主要介紹了mybatis-plus使用generator實現(xiàn)逆向工程,具有一定的參考價值,感興趣的可以了解一下2022-05-05
SpringBoot統(tǒng)一數(shù)據返回的方法實現(xiàn)
在前后端交互過程中,為了便于數(shù)據處理,后端數(shù)據需要進行統(tǒng)一封裝返回給前端,這種做法不僅方便前后端溝通,降低了溝通成本,還有助于項目的統(tǒng)一維護和后端技術部門的規(guī)范制定,本文就來介紹一下2024-10-10
java8 集合 多字段 分組 統(tǒng)計個數(shù)代碼
這篇文章主要介紹了java8 集合 多字段 分組 統(tǒng)計個數(shù)代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

