2013-12-19 35 views
0

我想同时做下的事情:的Java并发:选择同步采集

  1. 在收集(经常)
  2. 删除项目(或几个项目)的末尾添加新项从集合的开头(常)
  3. 删除收集的中间项(或几个项目)(很少,通过遍历所有项目发生)

问题:哪些并发收藏会给我最好的表现。

编辑:(如何发生的从中间删除)

我会遍历整个集合,发现begIndex并删除nbegIndex beggining下一个元素。

+0

你没有说你读/迭代你的收藏的频率。或者只是插入和删除?你怎么知道当它在中间时要移除哪个元素? – hgoebl

+0

[LinkedList Vs ConcurrentLinkedQueue]的可能重复(http://stackoverflow.com/questions/7316810/linkedlist-vs-concurrentlinkedqueue) –

回答

3

您描述的数据结构听起来完全像一个队列。 Java对此具有ConcurrentLinkedQueue

  1. 添加集合的新的结束:带O queue.add(1)
  2. 卸下:queue.poll O(1)
  3. 从任何位置删除:删除为O(n)

更多关于上

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

它指出那里

此实现采用了基于一个在简单,快捷,实用的非阻塞描述和 通过马吉德·M. Michael和迈克尔 L.阻塞并发队列算法 了有效的“无等待”算法斯科特。

1

您可以使用此一ConcurrentLinkedQueue,因为在固定时间内都offer(E)poll()过程中你最有可能的操作。 (我首先提出了一个ConcurrentLinkedDeque,但我错误地认为你想在队列的同一侧添加和移除元素,因为这不是一个需求更喜欢片面的队列。)

这个选择的唯一缺点是你需要重复n条目的Deque以便删除第n个元素。此外,该操作会阻塞或将提供故障的潜力,因为javadoc的状态:

返回的Iterator是一个“弱一致”的迭代器, 不会抛出ConcurrentModificationException,并且可确保 遍历元素,因为它们存在在构建迭代器时, 可能(但不能保证)反映在构建后的任何修改 。

除此之外,由于队列对于并发操作是非阻塞的,因此该队列在其他两个任务(从两端添加或从两端删除)上执行得非常好,当效率很重要时,您想要的是什么。

1

有一个相关的问题在这里与一个解决方案:LinkedList Vs ConcurrentLinkedQueue

答案建议使用一个ConcurrentLinkedQueue。从你的问题来看,你想要一个队列/链表像行为,所以我认为这会对你有帮助。