5

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

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

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

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

更新:下面的答案确实讨论了实现这一点的有效方法,但我遇到了很多由一般概念引起的问题(非标准,混淆实施者,不值得混淆的好处)。虽然我仍然相信这是一个有趣且有价值的途径,但它可能存在问题。和以往一样,在问“如何”做某事之前,你应该问“是否”你应该这样做。

4

4 回答 4

3

这就是我的做法。

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

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


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

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

于 2013-05-27T13:24:29.477 回答
1

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

于 2013-05-27T12:55:56.667 回答
0

为什么不同步??

 Collection c = Collections.synchronizedCollection(myCollection);

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

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

于 2013-05-27T12:54:26.020 回答
0

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

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

于 2013-05-27T13:19:33.203 回答