java - 如何实现不断增长的列表

标签 java multithreading list

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

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

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

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

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

最佳答案

这是我的做法。

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

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


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

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

关于java - 如何实现不断增长的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16773581/

相关文章:

java - 使用 PHP : withg java. lang.Exception 连接时出现问题:HTTP 错误:401

java - 使用 AndroidStudio 运行 JUnit 测试时出现异常 : java. lang.NoClassDefFoundError: android/os/Parcelable

java - 通过java连接sql

linux - pthread_sigmask 无法与 aio 回调线程一起正常工作

c# List<string> 赋值问题

java.net.BindException : Permission denied as root

objective-c - 在 macOS 上的另一个线程中设置线程的名称

c - 在用 C 编写的 MPI 应用程序中,使用 pthread_create 来创建线程来调用函数 MPI_Finalize

python - 你如何将列表作为新项目加入列表字典 - python?

c# - 按 id 区分包含对象的列表