如何实现增长清单

时间:2013-05-27 12:48:59

标签: java multithreading list

我正在尝试迭代相同的数据,但是只想在必要时加载数据。我还想在多个并发迭代器中重用获取的数据。

是否有一个对象或模式允许我创建一个底层数据,如果数据耗尽,有机会获取更多数据,但是在多个实例中使用相同的获取数据?该列表应该能够同时使用。我碰巧使用的是Java。

我当前创建了一个Iterator,它返回可以使用的值,如果它的缓冲区中的数据耗尽,它会查找更多要返回的数据。不幸的是,这意味着如果对象有多个实例,它将为每个实例处理一次数据。

如果我使用LinkedList,我担心ConcurrentModificationError。

更新:下面的答案确实讨论了实现这一目标的有效方法,但是我一直存在很多问题(非标准,混淆实现者,不值得混淆的好处)。虽然我仍然认为这是一种兴趣和有价值的途径,但它可能会有问题。一如既往,在询问“如何”做某事之前,你应该问“是否”你应该这样做。

4 个答案:

答案 0 :(得分:3)

我是这样做的。

  • 创建一个实现Iterable
  • 的类
  • 该类需要一个类型为ArrayList的私有变量,该变量初始化为空列表。
  • 该类需要一个fill方法,该方法从数据源中提取一个或多个条目,并将它们添加到私有列表的末尾。
  • noMore方法无法获取更多数据时,该类需要设置fill标记。
  • 该类需要iterator()方法来传递内部Iterator类的新实例:
    • 每个迭代器都需要一个私有索引...并在父类列表中定位。
    • hasNext方法针对父类列表大小()测试索引。如果它们相同,则会调用fill。如果设置了noMore标志,则返回false
    • next方法......你明白了。

所有这些都需要正确同步......


此方法通过隐藏私有列表而不在其上使用ConcurrentModificationExceptions来避免Iterator的问题。实际的迭代器将使用私有列表上的get(int)来获取元素。

注意:如果公开私有列表允许其他代码以正常方式更新或迭代列表,则此方法将无法预测。

答案 1 :(得分:1)

不确定我是否理解您的问题,但CopyOnWriteArrayList:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html是否适合您的目的?

答案 2 :(得分:0)

为什么不同步??

 Collection c = Collections.synchronizedCollection(myCollection);
  

当迭代它时,用户必须手动同步返回的集合:

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedCollection(java.util.Collection)

答案 3 :(得分:0)

也许你可以使用对象池?我不知道你想要用什么样的数据做什么,但我相信通过一些修改,对象池可能适合你的需求。

指向示例对象池的链接 http://sourcemaking.com/design_patterns/object_pool/java