鍍金池/ 教程/ Java/ 阻塞隊列
Slipped Conditions
阻塞隊列
無阻塞算法
嵌套管程鎖死
Java 并發(fā)性和多線程介紹
死鎖
線程安全及不可變性
并發(fā)編程模型
Java 中的讀/寫鎖
剖析同步器
競態(tài)條件與臨界區(qū)
多線程的優(yōu)點
CAS
線程通信
如何創(chuàng)建并運行 java 線程
阿姆達爾定律
避免死鎖
信號量
多線程的代價
饑餓和公平
線程池
重入鎖死
Java 中的鎖
Java 內(nèi)存模型
線程安全與共享資源
Java 同步塊

阻塞隊列

阻塞隊列與普通隊列的區(qū)別在于,當(dāng)隊列是空的時,從隊列中獲取元素的操作將會被阻塞,或者當(dāng)隊列是滿時,往隊列里添加元素的操作會被阻塞。試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊列重新變得空閑起來,如從隊列中移除一個或者多個元素,或者完全清空隊列,下圖展示了如何通過阻塞隊列來合作:

http://wiki.jikexueyuan.com/project/java-concurrent/images/17.png" alt="" />

線程 1 往阻塞隊列中添加元素,而線程 2 從阻塞隊列中移除元素

從 5.0 開始,JDK 在 java.util.concurrent 包里提供了阻塞隊列的官方實現(xiàn)。盡管 JDK 中已經(jīng)包含了阻塞隊列的官方實現(xiàn),但是熟悉其背后的原理還是很有幫助的。

阻塞隊列的實現(xiàn)

阻塞隊列的實現(xiàn)類似于帶上限的 Semaphore 的實現(xiàn)。下面是阻塞隊列的一個簡單實現(xiàn)

public class BlockingQueue {

private List queue = new LinkedList();

private int  limit = 10;

public BlockingQueue(int limit){

this.limit = limit;

}

public synchronized void enqueue(Object item)

throws InterruptedException  {

while(this.queue.size() == this.limit) {

wait();

}

if(this.queue.size() == 0) {

notifyAll();

}

this.queue.add(item);

}

public synchronized Object dequeue()

throws InterruptedException{

while(this.queue.size() == 0){

wait();

}

if(this.queue.size() == this.limit){

notifyAll();

}

return this.queue.remove(0);

}

}

必須注意到,在 enqueue 和 dequeue 方法內(nèi)部,只有隊列的大小等于上限(limit)或者下限(0)時,才調(diào)用 notifyAll 方法。如果隊列的大小既不等于上限,也不等于下限,任何線程調(diào)用 enqueue 或者 dequeue 方法時,都不會阻塞,都能夠正常的往隊列中添加或者移除元素。

上一篇:Slipped Conditions下一篇:死鎖