gpt4 book ai didi

Java 对列表的并发访问只有 1 个编写者和许多对象

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:58 25 4
gpt4 key购买 nike

我有以下情况:

我需要一个列表或其他任何东西来存储许多对象。

它们都是由包含列表本身的一个类生成的。

现在,我在其他线程中至少有一个(但也许更多)类,它们总是希望从列表中的第一个对象开始,并定期(20ms-100ms)获取下一个对象。

该列表随着时间的推移而不断增长。最后最多可以有 300k 个对象。 (其中一个对象最多可以包含 50 个整数或类似的东西)

具有自己的迭代器实现的 ConcurrentLinkedQueue 是正确的方法吗?需要自己的迭代器来拒绝删除选项吗?

最佳答案

如果您有 1 个写入器和多个读取器,随着列表的增长而迭代列表,那么是的,我绝对建议使用 ConcurrentLinkedQueue。它是为队列上的多个并发操作而设计的。

不能使用Collections.synchronizedList,因为Javadocs specifically warn关于迭代列表的修改:

It is imperative that the user manually synchronize on the returned list when iterating over it:

显然,当队列变得巨大(300k 项)时,迭代器是使用 ConcurrentLinkedQueue 的方法。请小心 Queue 方法,这些方法会导致您的程序在整个队列中运行以查找条目等。

另一个需要考虑的选项是ConcurrentSkipListMap在 Java 6+ 中可用。虽然它是一个 log2 查找映射,但它也有有序条目,因此迭代与队列相同。这允许您同时对集合执行映射和队列操作。跳过列表++。

编辑:

Own iterator is needed to deny remove option?

如果您询问是否需要重写迭代器以不允许删除,那么是的。您可以考虑扩展整个Queue以返回您自己的自定义委托(delegate)迭代器并阻止Queue.remove(...)

关于Java 对列表的并发访问只有 1 个编写者和许多对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com