Java同步工具类——信号量
計數信號量(Counting Semaphore)用來控制同時訪問某個特定資源的操作數量,或者執行某個特定操作的數量。計數信號量還可以用來實現某種資源池或者對容器加邊界。
Semaphore中管理著一組虛擬的許可(permit),許可的初始數量可通過構造函數來指定,在執行操作時可以首先獲得許可(只要還有剩余的許可),并在使用以后釋放許可。如果沒有許可,那么acquire將阻塞知道有許可(或者知道被中斷或者操作超時)。release方法將返回一個許可給信號量。計算信號量的一種簡化形式是二值信號量,即初始值為1的Semaphore二值信號量可以用作互斥體(mutex),并具備不可重入的加鎖語義:誰擁有這個唯一的許可,誰就擁有了互斥鎖。如果你想學習Python可以來這個群,首先是二二零,中間是一四二,最后是九零六,里面有大量的學習資料可以下載、
Semaphore可以用于實現資源池,例如數據庫連接池。我們可以構造一個固定長度的資源池,當池為空時,請求資源會失敗,但你真正希望的行為是阻塞而不是失敗,并且當池非空時解除阻塞。如果將Semaphore的初始值初始化為池的大小,并在池中獲取一個資源之前首先調用acquire獲取一個許可,在將資源返回給池之后調用release釋放許可,那么acquire將一致阻塞直到資源池不為空。(在構造阻塞對象池時,一種更簡單的方法是使用阻塞隊列,不過阻塞隊列沒有計數信號量中“計數”的功能)。
同樣,你也可以使用Semaphore將任何一種容器變成有界阻塞容器,見代碼:
public class BoundedHashSet<T> {private final Set<T> set;private final Semaphore sem;public BoundedHashSet(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;} }總結
以上是生活随笔為你收集整理的Java同步工具类——信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: varnish---反向代理web加速缓
- 下一篇: bps、Bps、pps