Java併發程式設計實戰--計數訊號量(Semaphore)
計數訊號量(Counting Semaphore)用來控制同時訪問某個特定資源的運算元量,或者同時執行某個指定操作的數量。計數訊號量還可以用來實現某種資源池,或者對容器施加邊界。
Semaphore中管理著一組虛擬的許可(permit),許可的初始數量可通過建構函式來指定。在執行操作時可以首先獲得許可(只要還有剩餘的許可),並在使用以後釋放即可。如果沒有許可,那麼aquire將阻塞直到有許可(或者直到被中斷或者操作超時)。release方法將返回一個許可給訊號量。
在這種實現中不包含真正的許可物件,並且Semaphore也不會將許可與執行緒關聯起來,因此在一個執行緒中獲得的許可可以在另一個執行緒中釋放。
可以將acquire操作視為是消費一個許可,而release操作是建立一個許可,Semaphore並不受限於它在建立時的初始許可數量。
計算訊號量的一種簡化形式是二值訊號量,即初始值為1的Semaphore。二值訊號量可以用作互斥體(mutex),並具備不可重入的加鎖語義:誰擁有這個唯一的許可,誰就擁有了互斥鎖。
Semaphore可以用於實現資源池,例如資料庫連線池。我們可以構造一個固定長度的資源池,當池為空時,請求資源將會失敗,但你真正希望看到的行為是阻塞而不是失敗,並且當池非空時解除阻塞。如果將Semaphore的計數值初始化為池的大小,並在從池中獲取一個資源之前先呼叫aquire方法獲得一個許可,在將資源返回給池之後呼叫release釋放許可,這樣就實現了固定長度了。
同樣,你可以使用Semaphore將任何一種容器變成有界阻塞容器,如下程式碼所示。訊號量的計數值會初始化為容器容量的最大值。add操作在向底層容器中新增一個元素之前,首先需要獲得一個許可。如果add操作沒有新增任何元素,那麼會立刻釋放許可。同樣remove操作釋放一個許可,使更多的元素能夠新增到容器中。底層的Set實現並不知道關於邊界的任何資訊,這是由BoundedHashSet來處理的。
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併發程式設計實戰pdf及案例原始碼下載:
http://download.csdn.net/detail/xunzaosiyecao/9851028
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
相關文章
- [java併發程式設計]基於訊號量semaphore實現限流器Java程式設計
- Java併發工具類(訊號量Semaphore)Java
- Java併發程式設計實戰Java程式設計
- Java併發程式設計:CountDownLatch、CyclicBarrier和SemaphoreJava程式設計CountDownLatch
- 實戰Java高併發程式設計模式視訊Java程式設計設計模式
- Java併發程式設計實戰--FutureTaskJava程式設計
- Java 併發程式設計(十五) -- Semaphore原始碼分析Java程式設計原始碼
- java多執行緒:併發包中的訊號量和計數栓的程式設計模型Java執行緒程式設計模型
- Java併發程式設計實戰--Amdahl定律Java程式設計
- Java併發系列—併發程式設計挑戰Java程式設計
- Java併發程式設計實戰總結 (一)Java程式設計
- 《JAVA併發程式設計實戰》顯式鎖Java程式設計
- Java併發程式設計實戰(4)- 死鎖Java程式設計
- Java併發程式設計實戰——讀後感Java程式設計
- Java併發程式設計實戰--筆記三Java程式設計筆記
- Java併發程式設計實戰--筆記四Java程式設計筆記
- Java併發程式設計實戰--筆記二Java程式設計筆記
- Java併發程式設計實戰--this引用逸出Java程式設計
- Java併發程式設計實戰--筆記一Java程式設計筆記
- Java併發程式設計實戰--閉鎖 CountDownLatchJava程式設計CountDownLatch
- 突擊併發程式設計JUC系列-併發工具 Semaphore程式設計
- Java多執行緒併發工具類-訊號量Semaphore物件講解Java執行緒物件
- 【面試實戰】# 併發程式設計面試程式設計
- Java併發程式設計實戰--事實不可變物件Java程式設計物件
- 《JAVA併發程式設計實戰》任務執行Java程式設計
- 《JAVA併發程式設計實戰》取消和關閉Java程式設計
- 《JAVA併發程式設計實戰》物件的組合Java程式設計物件
- Java併發程式設計 - 第十一章 Java併發程式設計實踐Java程式設計
- Java併發程式設計實踐Java程式設計
- 併發程式設計實戰——鎖分段程式設計
- 《JAVA併發程式設計實戰》基礎構建模組Java程式設計
- 《JAVA併發程式設計實戰》原子變數和非阻塞同步機制Java程式設計變數
- java 併發程式設計Java程式設計
- Java併發程式設計Java程式設計
- Java併發程式設計之原子變數Java程式設計變數
- 10. Semaphore ||(訊號量)
- Semaphore-訊號量的實現分析
- JAVA實現網路程式設計之併發程式設計Java程式設計