【发布时间】:2023-03-16 19:13:01
【问题描述】:
在我正在处理的多线程应用程序中,我们偶尔会在列表中看到ConcurrentModificationExceptions(主要是ArrayList,有时是向量)。但在其他时候,我认为正在发生并发修改,因为迭代集合似乎缺少项目,但没有抛出异常。我知道ConcurrentModificationException 的文档说您不能依赖它,但是我将如何确保我不会同时修改列表?并且将每个对集合的访问包装在同步块中是防止它的唯一方法吗?
更新:是的,我知道Collections.synchronizedCollection,但它并不能防止有人在您迭代集合时修改它。我认为,当有人在我迭代集合时向集合中添加某些内容时,至少会出现一些问题。
第二次更新如果有人想像 Jason 那样提到 synchronizedCollection 和克隆,同时提到 java.util.concurrent 和 jacekfoo 和 Javamann 那样的 apache 集合框架,我可以接受答案。
【问题讨论】:
-
RE 更新:在迭代之前使用同步集合和复制列表内容的组合是必要的。
-
杰森,是的,我现在明白了。如果您要在答案中提及 CopyOnWriteArrayList,我会接受。
-
当你迭代时,列表的“实时”版本没有被修改是否重要,或者你可以迭代一个可能陈旧的副本?我认为可能还有一个设计问题(谁控制对列表的访问?),以及同步和 java.util.concurrent 的使用。
-
OK Paul -- 将您要求的项目添加到我的回答中。
标签: java collections