我想同时做下的事情:的Java并发:选择同步采集
- 在收集(经常)
- 删除项目(或几个项目)的末尾添加新项从集合的开头(常)
- 删除收集的中间项(或几个项目)(很少,通过遍历所有项目发生)
问题:哪些并发收藏会给我最好的表现。
编辑:(如何发生的从中间删除)
我会遍历整个集合,发现begIndex
并删除n
从begIndex
beggining下一个元素。
我想同时做下的事情:的Java并发:选择同步采集
问题:哪些并发收藏会给我最好的表现。
编辑:(如何发生的从中间删除)
我会遍历整个集合,发现begIndex
并删除n
从begIndex
beggining下一个元素。
您描述的数据结构听起来完全像一个队列。 Java对此具有ConcurrentLinkedQueue。
更多关于上
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html
它指出那里
此实现采用了基于一个在简单,快捷,实用的非阻塞描述和 通过马吉德·M. Michael和迈克尔 L.阻塞并发队列算法 了有效的“无等待”算法斯科特。
您可以使用此一ConcurrentLinkedQueue
,因为在固定时间内都offer(E)
和poll()
过程中你最有可能的操作。 (我首先提出了一个ConcurrentLinkedDeque
,但我错误地认为你想在队列的同一侧添加和移除元素,因为这不是一个需求更喜欢片面的队列。)
这个选择的唯一缺点是你需要重复n
条目的Deque
以便删除第n
个元素。此外,该操作会阻塞或将提供故障的潜力,因为javadoc的状态:
返回的Iterator是一个“弱一致”的迭代器, 不会抛出ConcurrentModificationException,并且可确保 遍历元素,因为它们存在在构建迭代器时, 可能(但不能保证)反映在构建后的任何修改 。
除此之外,由于队列对于并发操作是非阻塞的,因此该队列在其他两个任务(从两端添加或从两端删除)上执行得非常好,当效率很重要时,您想要的是什么。
有一个相关的问题在这里与一个解决方案:LinkedList Vs ConcurrentLinkedQueue
答案建议使用一个ConcurrentLinkedQueue
。从你的问题来看,你想要一个队列/链表像行为,所以我认为这会对你有帮助。
你没有说你读/迭代你的收藏的频率。或者只是插入和删除?你怎么知道当它在中间时要移除哪个元素? – hgoebl
[LinkedList Vs ConcurrentLinkedQueue]的可能重复(http://stackoverflow.com/questions/7316810/linkedlist-vs-concurrentlinkedqueue) –