2016-04-19 38 views
3

我正在尋找可以維護廣告訂單的併發列表。有沒有人有一些好的建議?維護廣告訂單的併發集合

我看了一些番石榴, SetFromMap,但它們在新版本中已棄用。

謝謝。

+0

你正在尋找一個列表或一組?因爲清單按定義維護廣告訂單。 – Mena

+0

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html –

+1

可能有[在Java的JDK中有併發列表?](http:// stackoverflow。 com/questions/6916385/is-there-a-concurrent-list-in-javas-jdk) –

回答

3

如果你有大部分是讀操作,很少有寫操作,你沒有太多的元素,那麼你可以使用CopyOnWriteArrayList,因爲它是一個無鎖執行List讀取操作,使它幾乎不可能更快,但它是非常昂貴的寫操作至於每一個寫,它重新構建整個List能夠爲下一次讀取操作提供新的只讀副本。

至於你的情況,你有很多的寫操作和大量元素來把你的收藏,CopyOnWriteArrayList顯然不是一個選擇。

我在你的情況下建議使用一個線程安全的Queue,你可以找到java.util.concurrent包。根據你的情況和你的JDK版本是最好的選擇可能會改變,但如果你不特別需要一個blocking queuedeque但只有pure collection,最好的選擇可能是ArrayBlockingQueueConcurrentLinkedQueueLinkedBlockingQueue但根據該benchmark result(略位老),LinkedBlockingQueue提供了最好的整體表現。

但是,當我們談論的表演,第一個和最重要的建議是:總是在你的目標環境中進行測試,它是知道什麼是適合你的最佳選擇的唯一有效途徑。

3

A CopyOnWriteArrayListList,它們都保持插入順序(預期從List)並允許併發訪問。

Docs here

+0

這個假設寫入速率很低,但它是最接近的匹配。 –

0

最大將是10K元素

如果你有一個非常低的更新速率,是的CopyOnWriteArrayList一個可能的解決方案。這將有效地實現併發讀取。

您遇到的問題是併發和有序是相反的擔憂。要進行訂購,您需要序列化更新以確定訂單。要具有併發性,您需要放棄排序。

有一個的ConcurrentLinkedQueue,然而,這僅允許併發讀(1),寫(1)