Java并发:选择同步集合
我想同时做下一件事:Java并发:选择同步集合,java,java.util.concurrent,Java,Java.util.concurrent,我想同时做下一件事: 在收藏结束时添加新项目(通常) 从集合的开头删除项(或少数项)(通常) 从集合中间移除项(或少数项)(很少通过迭代所有项来实现) 问题:哪一个并发集合将为我提供最佳性能 编辑:(如何从中间删除) 我将迭代整个集合,找到begIndex,并从begIndex中删除n下一个元素。您描述的数据结构听起来完全像一个队列。Java为此提供了ConcurrentLinkedQueue 添加新的集合结尾:queue.Add和O(1) 删除:queue.poll O(1) 从任何位置移除:
我将迭代整个集合,找到
begIndex
,并从begIndex
中删除n
下一个元素。您描述的数据结构听起来完全像一个队列。Java为此提供了ConcurrentLinkedQueue
您描述的数据结构听起来完全像一个队列。Java为此提供了ConcurrentLinkedQueue
offer(E)
和poll()
都会在固定时间内处理最可能的操作。(我建议先添加元素,但我误解了您希望在队列的同一侧添加和删除元素。因为这不是一个要求,所以我更喜欢单侧队列。)
此选择的唯一缺点是,您需要迭代Deque
的n
条目,以删除n
-th元素。此外,由于javadoc声明:
返回的迭代器是一个“弱一致”迭代器,它将
永远不要抛出ConcurrentModificationException,并保证
遍历迭代器构造时存在的元素,
并且可能(但不保证)反映任何修改
施工之后
除此之外,此队列将在其他两个任务(添加或从两端移除)上执行得非常好,因为队列对于并发操作来说是非阻塞的,而在效率很重要的情况下,这是您想要的。您可以使用a来执行此任务,因为提供(E)
和轮询()
在固定时间内处理最可能的操作。(我建议先添加元素,但我误解了您希望在队列的同一侧添加和删除元素。因为这不是一个要求,所以我更喜欢单侧队列。)
此选择的唯一缺点是,您需要迭代Deque
的n
条目,以删除n
-th元素。此外,由于javadoc声明:
返回的迭代器是一个“弱一致”迭代器,它将
永远不要抛出ConcurrentModificationException,并保证
遍历迭代器构造时存在的元素,
并且可能(但不保证)反映任何修改
施工之后
除此之外,此队列将在其他两个任务(添加或从两端移除)上执行得非常好,因为对于并发操作,队列是非阻塞的。当效率很重要时,您需要什么。这里有一个相关问题和解决方案:
答案建议使用
ConcurrentLinkedQueue
。从您的问题来看,您需要类似队列/链表的行为,因此我认为这将对您有所帮助。这里有一个相关的问题和解决方案:
答案建议使用
ConcurrentLinkedQueue
。从您的问题中可以看出,您需要类似队列/链表的行为,因此我认为这将对您有所帮助。您没有说明您阅读/迭代收藏的频率。或者只是插入和删除?当你在中间的时候,你怎么知道要删除哪个元素?你可能的副本没有说明你读/重复你的集合的频率。或者只是插入和删除?你怎么知道在中间的时候要删除哪个元素?可能的复制品