在迭代时是否有支持并发修改的列表集合?

 jiangping最棒_766 发布于 2023-02-08 16:38

是否有一个实现List接口的容器在迭代时支持并发修改?具体来说,我希望一个线程迭代集合,而许多线程插入并从此列表中删除元素.迭代器应该看到它尚未遍历的列表的修改.

我正在寻找类似于ConcurrentLinkedQueue的迭代行为,但支持在特定索引处添加和删除元素.我最好寻求强一致性(我愿意为它支付锁争用开销),但我可能会忍受弱一致性.

我很高兴看到第三方库,因为我在标准库中看不到任何提供我正在寻找的内容的东西.

1 个回答
  • 有一些接近的东西.它被称为CopyOnWriteArrayList- 虽然限制是迭代器在迭代时不会看到所做的更改,但它将继续迭代迭代开始时的集合.

    该集合在写入时很慢(但读取速度很快),这是另一个需要考虑的事情.

    jME3 SafeArrayList 在这里有一个名为doc的内部Collection ,速度更快,但不支持多线程访问.它确实支持从迭代器等访问(因此你可以循环遍历列表中的对象并同时添加/删除它们,只要你不尝试从多个线程执行此操作).同样,迭代器在迭代时不会看到所做的更改,它们将继续迭代原始数据.

    并发包提供了许多其他可能有用的数据结构.

    另一种方法是只使用一个标准的ArrayList,synchronize名单上的修改和读取,然后使用指数迭代它.(即list.get(i)).

    但是会有很多边缘情况.例如,如果删除一个元素,它将向下移动所有其他元素,因此您将在该点之后的任何迭代器上跳过一个元素.

    实际上,您最终可能需要保留迭代器列表,并在添加/删除元素时循环遍历迭代器列表并相应地更新其位置!

    2023-02-08 16:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有