Java并发:选择同步集合

时间:2013-12-19 12:50:06

标签: java java.util.concurrent

我想同时做下一件事:

  1. 在收藏结束时(经常)添加新项目
  2. 从收集的开头(经常)删除项目(或少数项目)
  3. 从集合中间删除项目(或少数项目)(很少通过迭代所有项目)
  4. 问题: 哪个并发收集会给我带来最佳效果。

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

    我会迭代整个集合,找到begIndex并删除n下一个从begIndex开始的元素。

3 个答案:

答案 0 :(得分:3)

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

  1. 添加新的集合结尾:queue.add with O(1)
  2. 删除:queue.poll O(1)
  3. 从任何位置移除:移除O(n)
  4. 关于

    的更多信息

    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。根据你的问题,你发现你想要一个像行为一样的队列/链接列表,所以我认为这会对你有帮助。