Java 我使用了同步列表,但仍然得到ConcurrentModificationException

Java 我使用了同步列表,但仍然得到ConcurrentModificationException,java,multithreading,vector,synchronized,Java,Multithreading,Vector,Synchronized,我使用Vector而不是ArrayList在多线程环境中创建一个安全的列表。但是当我尝试在迭代过程中将项目添加到向量时,我不断得到ConcurrentModificationException。这是为什么?我如何防止它?在对向量进行迭代时,不能修改向量。将要添加的项存储在单独的向量中,并在循环完成或循环原始向量的副本时将其移动到向量中 增加: 要在java中获取向量周围的互斥体,请在两个函数中执行此操作: synchronized (list) { // modifying list }

我使用
Vector
而不是
ArrayList
在多线程环境中创建一个安全的列表。但是当我尝试在迭代过程中将项目添加到
向量时,我不断得到
ConcurrentModificationException
。这是为什么?我如何防止它?

在对向量进行迭代时,不能修改向量。将要添加的项存储在单独的向量中,并在循环完成或循环原始向量的副本时将其移动到向量中

增加: 要在java中获取向量周围的互斥体,请在两个函数中执行此操作:

synchronized (list) {
  // modifying list
}
以及:


当然,我假设列表名为
list

,如果您想在迭代时添加项目,那么您需要使用。通过使用
Vector
,您没有绕过此规则(显然),因此我建议使用
ArrayList

如果您需要迭代并同时添加到列表中,您应该使用并发列表,例如。请注意,如果您在列表中写了很多内容,那么它将不会非常有效


否则,如果使用向量或synchronizedList,则需要在迭代时保持列表的锁。这将防止出现异常,但也会防止并发…

旁注:即使在单线程程序中也是如此。什么意思在单线程程序中也是如此?在对列表进行迭代时,您永远不能修改列表。甚至在单线程程序中。修改基础列表会使迭代器无效。那么,在这种情况下,同步集合的目的是什么?@assylias该类并不是这样做的。它复制了列表,扔掉了旧的。我的建议是等待迭代器完成后再添加新项。如果涉及多个线程,我认为在使用ListIterator进行迭代时添加新项是不安全的。@assylias,我想我误解了这个问题。我只是在处理
ConcurrentModificationException
.concurrent!=平行的您可以通过单个线程获得ConcurrentModificationException。
synchronized (list) {
  // iterating over list
}