2016-03-13 101 views
10

何時更喜歡LinkedBlockingQueue超過ArrayBlockingQueue何時更喜歡LinkedBlockingQueue而不是ArrayBlockingQueue?

哪些數據結構中LinkedBlockingQueueArrayBlockingQueue時使用:

  1. 你想要一個高效的讀取和寫入
  2. 應該有更小的內存佔用

雖然也存在類似的問題,但它沒有強調哪個應該是首選的事實?

鏈接:

回答

18

鮑里斯蜘蛛已經列出了ArrayBlockingQueueLinkedBlockingQueue之間最明顯的區別 - 前者總是有界的,而後者可能是無界的。

因此,如果您需要無限制的阻塞隊列,LinkedBlockingQueueLinkedTransferQueue用作BlockingQueuejava.util.concurrent工具箱的最佳投注。

但是讓我們假設你需要一個有界的阻塞隊列。最後,你應該選擇一個基於廣泛的實驗和實際工作負載模擬的實現。 然而,這裏有一些注意事項,可以幫助您與您所選擇或解釋從實驗結果:

  • ArrayBlockingQueue可以用配置來創建(開/關)調度的公平性的政策。如果你需要公平性或者想要避免生產者/消費者的飢餓,這是非常好的,但是這會導致你的吞吐量。
  • ArrayBlockingQueue預先分配其後備數組,因此它在使用過程中不會分配節點,但它會立即使用相當可觀的內存塊,如果內存出現碎片,這可能會造成問題。
  • ArrayBlockingQueue應在性能較小的變化,因爲它有運動部件少的整體,它採用了簡單和不太複雜的單鎖算法,它在使用過程中不產生節點,它的緩存行爲應該是相當一致的。
  • LinkedBlockingQueue應該有更好的吞吐量,因爲它使用單獨的頭部和尾部的鎖。
  • LinkedBlockingQueue不預先分配的節點,這意味着它的內存佔用量將大致匹配它的大小,但它也意味着它會招致分配和節點釋放一些工作。
  • LinkedBlockingQueue可能會有更糟糕的緩存行爲,這可能會影響其自身的性能,但也會由於虛假共享而影響其他組件的性能。

根據您的使用情況和多少你關心性能,你可能也想看看外面的java.util.concurrent,並考慮Disruptor(一個非常快,但有些專業界無阻塞環形緩衝區)或JCTools (根據生產者和消費者的數量,各種有界限或無界限的不同保障隊列)。

+0

好的答案!我同意你提到的內容,我還想強調(再一次)ArrayBlockingQueue由一個數組支持的事實,該數組的大小在創建之後永遠不會改變。將容量設置爲Integer.MAX_VALUE會創建一個空間成本高的大陣列。 ArrayBlockingQueue總是有界的。 LinkedBlockingQueue動態創建節點,直到達到容量。這是默認情況下的Integer.MAX_VALUE。使用這麼大的容量在太空中沒有額外的成本。 LinkedBlockingQueue是可選的有界。 –

-1

他們都實現BlockingQueue。顧名思義,arrayBlockingQueueArray支持,而LinkedBlockingQueue支持linked list

選擇哪一個應該基本上是相同的ArrayListLinkedList

之間進行選擇的原因添加到ArrayBlockingQueue一個元件被認爲是更快,因爲它意味着僅設置於背襯的一個元素的引用對象數組,同時向LinkedBlockingQueue添加元素意味着創建一個Node並設置其項目prevnext字段。此外,當我們從LinkedBlockingQueue中刪除一個元素時,被刪除的節點變成垃圾,可能會影響應用程序的性能。

+0

這只是一個部分答案,主要的不同是'ArrayBlockingQueue'被一個**固定大小**數組(使用循環數組實現)綁定。 –

+0

@BoristheSpider,請檢查其他推理。除了在答案中指定的點之外,blockingQueues與底層數據結構具有相同的含義 – Rahul

+0

兩個隊列的鎖結構完全不同。比較它們的內部結構有點不相關;你需要了解哪些鎖結構中比較特別的多線程環境中更好地 - 一個作家/很多讀者,許多作家/一個讀者等等等等 –

5

JavaDoc for ArrayBlockingQueue

界定由數組支持阻塞隊列。

重點礦山

JavaDoc for LinkedBlockingQueue

基於鏈接節點的任選範圍阻塞隊列。

重點煤礦

所以如果你需要一個隊列中您可以使用,如果你需要,你必須使用一個LinkedBlockingQueue無限隊列

對於一個有界的隊列,那麼你需要基準來找出哪個更好。

+0

爲了能夠申報無界隊列也是原因之一,如我的答案指定因爲linkedList是無界的,而數組不是。 – Rahul

+0

@rahulroc你實際上從來沒有這樣說過,也從不爲你的斷言提供任何證據。說數組支持的集合是有限的也是簡單和不真實的 - 一個'ArrayList'是數組支持的。 –

+0

感謝您的回答@BoristheSpider。你是對的,這是偏好的一個很好的理由,但是我們在性能上有差異: 1。你想要一個有效的讀寫 2.不關心隊列是否有界 3.應該有較少的內存佔用? –

相關問題