Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java并发:选择同步集合_Java_Java.util.concurrent - Fatal编程技术网

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

  • 添加新的集合结尾:queue.Add和O(1)
  • 删除:queue.poll O(1)
  • 从任何位置移除:移除O(n)
  • 更多关于这个的

    那里说

    该实现采用了一种高效的“无等待”算法 在中描述的简单、快速、实用的非阻塞和 阻止并发队列算法由Maged M.Michael和Michael编写 L.斯科特


    您描述的数据结构听起来完全像一个队列。Java为此提供了ConcurrentLinkedQueue

  • 添加新的集合结尾:queue.Add和O(1)
  • 删除:queue.poll O(1)
  • 从任何位置移除:移除O(n)
  • 更多关于这个的

    那里说

    该实现采用了一种高效的“无等待”算法 在中描述的简单、快速、实用的非阻塞和 阻止并发队列算法由Maged M.Michael和Michael编写 L.斯科特

    您可以使用a来进行此操作,因为
    offer(E)
    poll()
    都会在固定时间内处理最可能的操作。(我建议先添加元素,但我误解了您希望在队列的同一侧添加和删除元素。因为这不是一个要求,所以我更喜欢单侧队列。)

    此选择的唯一缺点是,您需要迭代
    Deque
    n
    条目,以删除
    n
    -th元素。此外,由于javadoc声明:

    返回的迭代器是一个“弱一致”迭代器,它将 永远不要抛出ConcurrentModificationException,并保证 遍历迭代器构造时存在的元素, 并且可能(但不保证)反映任何修改 施工之后

    除此之外,此队列将在其他两个任务(添加或从两端移除)上执行得非常好,因为队列对于并发操作来说是非阻塞的,而在效率很重要的情况下,这是您想要的。

    您可以使用a来执行此任务,因为
    提供(E)
    轮询()
    在固定时间内处理最可能的操作。(我建议先添加元素,但我误解了您希望在队列的同一侧添加和删除元素。因为这不是一个要求,所以我更喜欢单侧队列。)

    此选择的唯一缺点是,您需要迭代
    Deque
    n
    条目,以删除
    n
    -th元素。此外,由于javadoc声明:

    返回的迭代器是一个“弱一致”迭代器,它将 永远不要抛出ConcurrentModificationException,并保证 遍历迭代器构造时存在的元素, 并且可能(但不保证)反映任何修改 施工之后


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

    这里有一个相关问题和解决方案:


    答案建议使用
    ConcurrentLinkedQueue
    。从您的问题来看,您需要类似队列/链表的行为,因此我认为这将对您有所帮助。

    这里有一个相关的问题和解决方案:


    答案建议使用
    ConcurrentLinkedQueue
    。从您的问题中可以看出,您需要类似队列/链表的行为,因此我认为这将对您有所帮助。

    您没有说明您阅读/迭代收藏的频率。或者只是插入和删除?当你在中间的时候,你怎么知道要删除哪个元素?你可能的副本没有说明你读/重复你的集合的频率。或者只是插入和删除?你怎么知道在中间的时候要删除哪个元素?可能的复制品