Java基于Semaphore構(gòu)建阻塞對象池
java中使用Semaphore構(gòu)建阻塞對象池
Semaphore是java 5中引入的概念,叫做計數(shù)信號量。主要用來控制同時訪問某個特定資源的訪問數(shù)量或者執(zhí)行某個操作的數(shù)量。
Semaphore中定義了一組虛擬的permits,通過獲取和釋放這些permits,Semaphore可以控制資源的個數(shù)。
Semaphore的這個特性可以用來構(gòu)造資源池,比如數(shù)據(jù)庫連接池等。
Semaphore有兩個構(gòu)造函數(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ù),而fair則表示是否支持FIFO的順序。
兩個比較常用的方法就是acquire和release了。
public void acquire() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
public void release() {
sync.releaseShared(1);
}
其中acquire用來獲取資源,release用來釋放資源。
有了這兩個特性, 我們看一下怎么使用Semaphore來定義一個一個有界容器。
我們可以將Semaphore初始化為容器池大小,并且在容器池獲取資源時調(diào)用acquire,將資源返回給容器池之后再調(diào)用release。
我們看下面的一個實現(xiàn):
public class SemaphoreUsage<T> {
private final Set<T> set;
private final Semaphore sem;
public SemaphoreUsage(int bound){
this.set = Collections.synchronizedSet(new HashSet<T>());
sem= new Semaphore(bound);
}
public boolean add (T o) throws InterruptedException{
sem.acquire();
boolean wasAdded = false;
try{
wasAdded=set.add(o);
return wasAdded;
}finally {
if(!wasAdded){
sem.release();
}
}
}
public boolean remove(Object o){
boolean wasRemoved = set.remove(o);
if(wasRemoved){
sem.release();
}
return wasRemoved;
}
}
上面的例子我們定義了一個有界的synchronizedSet。 要注意一點是在add方法中,只有add成功之后才會調(diào)用release方法。
本文的例子請參考https://github.com/ddean2009/learn-java-concurrency/tree/master/Semaphore
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用springboot單元測試對weblistener的加載測試
這篇文章主要介紹了使用springboot單元測試對weblistener的加載測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
springboot中用fastjson處理返回值為null的屬性值
在本篇文章里小編給大家整理的是一篇關(guān)于springboot中用fastjson處理返回值問題詳解內(nèi)容,需要的朋友們參考下。2020-03-03
Spring配置多個數(shù)據(jù)源并實現(xiàn)動態(tài)切換示例
本篇文章主要介紹了Spring配置多個數(shù)據(jù)源并實現(xiàn)動態(tài)切換示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
java截取字符串中的指定字符的兩種方法(以base64圖片為例)
本文介紹了使用Java截取字符串中指定字符的方法,通過substring索引和正則實現(xiàn),文章詳細介紹了實現(xiàn)步驟和示例代碼,對于想要了解如何使用Java截取字符串指定字符的讀者具有一定的參考價值2023-08-08
SpringBoot整合EasyExcel實現(xiàn)大規(guī)模數(shù)據(jù)的并行導(dǎo)出與壓縮下載
在 Spring Boot 應(yīng)用中,整合 EasyExcel 實現(xiàn)并行導(dǎo)出數(shù)據(jù)并進行 Zip 壓縮下載可以極大地提高數(shù)據(jù)處理效率和用戶體驗,文中通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-10-10

