2013-06-12 33 views
17

我認爲,在大多數情況下,ArrayBlockingQueue將執行比LinkedBlockingQueue更好。然而,當數組中總是有足夠的空間的時候就是這種情況......如果它已經滿了,它是否會表現得如此之好並不是非常可預測的,因爲它會阻塞試圖將數據推入隊列的線程。Java:ArrayBlockingQueue與LinkedBlockingQueue

所以,我的問題是:是否有任何中間地帶執行BlockingQueue?說,ArrayListBlockingQueueBucketListBlockingQueue?類似於數組列表,以便隊列可以動態增加容量,同時仍然可以通過使用數組最終存儲數據來獲得合理的好處?

+0

數組列表不會提高性能......爲什麼呢?另外:爲什麼你擔心表演?你真的有問題嗎?你有個人資料嗎? – Dariusz

+0

我在想記憶的地方。如果您使用鏈接列表,其元素跳轉隨機內存地址,則更有可能導致緩存未命中以及類似問題。另外,爲了從內存中獲取數據,你必須獲取下一個元素的地址,然後獲取這個地址的內容......而對於一個數組,你只需要使用地址++來獲取下一個元素的地址。有了數組的列表,你會在兩個實現之間做出一些妥協......你是否認爲不然? –

+1

我認爲數組列表可以讓你從兩個原始集合中獲得優勢。你仍然需要分配內存,並且根據數組的大小,它會得到更多或更少的碎片。我認爲如果你使你的基於數組的集合調整大小算法正確,你將會有很少的調整和非常快的迭代。至於內存局部性 - 集合存儲對象的引用,並且這些對象本身可能位於內存中的任何位置,因此使用一個集合或其他對象時可能無法獲得這方面的好處。 – Dariusz

回答

6

我的2美分:

首先,這裏的底線是你真的不關心的區別就在這裏,因爲即使你使用的是普通的LinkedBlockingQueue,性能不夠好,當你交付一些微秒級別的系統。所以這裏的性能差異並不是很大。

如果您正在編寫關鍵任務的高性能系統,並且您正在使用隊列在線程之間傳遞消息,則可以始終根據[隊列大小] = [最大可接受延遲]估計隊列大小* [最大消息速率]。任何能夠超越這種能力的東西都意味着您會遇到緩慢的消費者問題。在關鍵任務應用中,這種延遲意味着您的系統出現故障。可能需要一些手動過程來確保系統正常運行。

如果您的系統不是關鍵任務,您可以暫停(阻止)發佈者,直到某些消費者可用。

14

1。的LinkedBlockingQueue(LinkedList的實現,但鏈表的不完全JDK實現它採用靜態內部類節點保持要素之間的聯繫)

Constructor for LinkedBlockingQueue 
public LinkedBlockingQueue(int capacity) 
{ 
     if (capacity < = 0) throw new IllegalArgumentException(); 
     this.capacity = capacity; 
     last = head = new Node<E>(null); // Maintains a underlying linkedlist. (Use when size is not known) 
} 

節點類使用,保有環節

static class Node<E> { 
    E item; 
    Node<E> next; 
    Node(E x) { item = x; } 
} 

2。 ArrayBlockingQueue(數組實現)

構造ArrayBlockingQueue

public ArrayBlockingQueue(int capacity, boolean fair) 
{ 
      if (capacity < = 0) 
       throw new IllegalArgumentException(); 
      this.items = new Object[capacity]; // Maintains a underlying array 
      lock = new ReentrantLock(fair); 
      notEmpty = lock.newCondition(); 
      notFull = lock.newCondition(); 
} 

IMHO ArrayBlockingQueue和的LinkedBlockingQueue之間最大的區別在於從構造一個具有數據結構陣列和其他鏈表底層清楚。

ArrayBlockingQueue使用single-lock double condition algorithm和的LinkedBlockingQueue是「兩個鎖定隊列」算法的變體,它有2把鎖2個條件(takeLock,putLock)

到目前爲止我給這些2個實施方式現在回到原來的問題之間的比較,類似的問題在concurrency mailing list中被詢問在這個道格Lea談論DynamicArrayBlockingQueue這是implementation provided by Dawid Kurzyniec.

+6

我在這裏看到一個人投票如果你不同意答案,請提供意見,以便我可以改善或糾正錯誤。 – Vipin

+0

更清楚'ArrayBlockingQueue'使用'圓陣列'作爲底層結構 +1 –

相關問題