我想同时做下一件事:
问题: 哪个并发收集会给我带来最佳效果。
编辑:(如何从中间删除)
我会迭代整个集合,找到begIndex
并删除n
下一个从begIndex
开始的元素。
答案 0 :(得分:3)
您描述的数据结构听起来完全像一个队列。 Java有 ConcurrentLinkedQueue 。
关于
的更多信息http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html
它声明那里
这种实施方式采用了高效的等待#34;算法 在简单,快速,实用的非阻塞和 阻止并发队列算法由 Maged M. Michael和Michael L. Scott。
答案 1 :(得分:1)
您可以使用ConcurrentLinkedQueue
,因为offer(E)
和poll()
都会在固定时间内处理您最有可能的操作。 (我先建议ConcurrentLinkedDeque
,但我误读你想在队列的同一侧添加和删除元素。因为这不是一个要求,所以更喜欢单侧队列。)
此选择的唯一缺点是您需要迭代n
的{{1}}个条目才能删除Deque
个元素。此外,此操作将阻止或提供失败潜力,因为javadoc声明:
返回的迭代器是一个“弱一致”的迭代器 永远不会抛出ConcurrentModificationException,并保证 在构造迭代器时存在的遍历元素, 并且可能(但不保证)反映任何修改 在施工之后。
除此之外,这个队列在其他两个任务(从两端添加或删除)上都能很好地执行,因为队列对于并发操作是非阻塞的,当效率很重要时,你需要什么。
答案 2 :(得分:1)
这里有一个相关的问题是解决方案:LinkedList Vs ConcurrentLinkedQueue
答案建议使用ConcurrentLinkedQueue
。根据你的问题,你发现你想要一个像行为一样的队列/链接列表,所以我认为这会对你有帮助。