Java併發——阻塞隊列的實現

1.使用場景

阻塞的應用場景,比如 生產-消費模式,限流統計等等。什麼 ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue 等等,都是阻塞隊列的實現。

但是我們發現其使用目的和消息隊列類似,實際上是的,只是阻塞隊列是用於單個系統的消息傳遞,生產者消費者模式,而消息隊列一般是分佈式系統間的生產者消費者模式,但無論是哪種形式,其實現都離不開基本的多線程同步編程模式。

2.實現原理

阻塞隊列(BlockingQueue)是一個接口,其具體實現分爲如下幾種,包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等等。

  • ArrayBlockingQueue:從名稱上就可以知道ArrayBlockingQueue底層是以數組模擬實現的,既然以數組模擬,其動態擴展便不方便,因此適合做有界隊列,需要在創建時就指定最大容量。
  • LinkedBlockingQueue:以鏈表模擬實現,由於是鏈表,擴展方便,因此適合做無界隊列。

下面講一下最主要的阻塞的實現,阻塞在於:隊列爲空時取元素,則線程阻塞;隊列滿時加元素,則線程阻塞。而對於這種生產者消費者模式,其實最方便的便是使用 鎖+多個條件變量 來實現。

自然而然想到需要兩個條件變量:notEmpty(隊列空,取元素時,一直阻塞在notEmpty上),notFull(隊列滿,添加元素,則一直阻塞在notFull上)。

下面貼上隊列空時的編碼過程:

final ReentranLock lock;
final Condition notEmpty;
final Condition notFull;

public E take() throw InterruptedException{
	final ReentranLock lcok = this.lock;
	lock.lockIntereruptibly();
	try{
		while(count==0){
			notEmpty.await();
		}
		return extract();
	}finally{
		lock.unlock();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章