如何实现增长清单

Jef*_*ave 5 java multithreading list

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

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

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

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

更新:下面的答案确实讨论了实现这一点的有效方法,但是我已经遇到了很多由一般概念引起的问题(非标准,混淆实现者,不值得混淆的好处).虽然我仍然认为这是一种兴趣和有价值的途径,但它可能会有问题.一如既往,在询问"如何"做某事之前,你应该问"是否"你应该这样做.

Ste*_*n C 3

我就是这样做的。

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

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


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

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