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.
數組列表不會提高性能......爲什麼呢?另外:爲什麼你擔心表演?你真的有問題嗎?你有個人資料嗎? – Dariusz
我在想記憶的地方。如果您使用鏈接列表,其元素跳轉隨機內存地址,則更有可能導致緩存未命中以及類似問題。另外,爲了從內存中獲取數據,你必須獲取下一個元素的地址,然後獲取這個地址的內容......而對於一個數組,你只需要使用地址++來獲取下一個元素的地址。有了數組的列表,你會在兩個實現之間做出一些妥協......你是否認爲不然? –
我認爲數組列表可以讓你從兩個原始集合中獲得優勢。你仍然需要分配內存,並且根據數組的大小,它會得到更多或更少的碎片。我認爲如果你使你的基於數組的集合調整大小算法正確,你將會有很少的調整和非常快的迭代。至於內存局部性 - 集合存儲對象的引用,並且這些對象本身可能位於內存中的任何位置,因此使用一個集合或其他對象時可能無法獲得這方面的好處。 – Dariusz