我正在寻找可以维持广告订单的并发列表。有没有人有一些好的推荐?
我从番石榴中看一些例如SetFromMap,但在新版本中不推荐使用它们。
谢谢。
答案 0 :(得分:4)
CopyOnWriteArrayList
是List
,它们都维护广告订单顺序(正如List
所预期的那样)并允许并发访问。
文档here。
答案 1 :(得分:3)
如果你主要是读取操作,很少有写操作,而你没有太多的元素,那么你可以使用CopyOnWriteArrayList
,因为它是一个List
的无锁实现,用于读取操作,如它几乎不会更快但写入操作的成本非常高,因为每次写入都会重新构建整个List
以便能够提供新的只读副本用于下一次读取操作。
在您的情况下,您有很多写入操作和很多元素要放入您的收藏中,CopyOnWriteArrayList
显然不是适合您的选项。
我建议您使用一个可以在Queue
包中找到的线程安全java.util.concurrent
。根据您的上下文和您的JDK版本,最佳选择可能会发生变化,但如果您不需要blocking queue
或deque
但只需要pure collection
,那么最佳选择可能是{ {1}},ArrayBlockingQueue
或ConcurrentLinkedQueue
但根据此benchmark result(有点旧),LinkedBlockingQueue
提供了最佳的整体表现。
但是当我们谈论表演时,第一个也是最重要的建议是:总是在目标环境上进行测试,这是了解什么是最佳选择的唯一有效方式 强>
答案 2 :(得分:0)
最大值为10k元素
如果您的更新率极低,CopyOnWriteArrayList是一种可能的解决方案。这将有效地进行并发读取。
你遇到的问题是并发和有序是相反的问题。要进行排序,您需要序列化更新以确定订单。要获得并发性,您需要放弃订购。
有一个ConcurrentLinkedQueue,但这只允许并发read(1)和write(1)