我在多线程环境下使用 Vector
而不是 ArrayList
来创建一个线程安全的列表。但当我尝试在迭代中添加项目到 Vector
时,我一直收到 ConcurrentModificationException
异常。为什么会发生这种情况,如何避免?
我在多线程环境下使用 Vector
而不是 ArrayList
来创建一个线程安全的列表。但当我尝试在迭代中添加项目到 Vector
时,我一直收到 ConcurrentModificationException
异常。为什么会发生这种情况,如何避免?
在迭代Vector时不能修改它。将要添加的项目存储在单独的Vector中,在循环结束时将它们移动到Vector中,或者在原始Vector的副本上进行循环。
添加: 要在Java中获取Vector周围的互斥锁,请在两个函数中执行此操作:
synchronized (list) {
// modifying list
}
并且:
synchronized (list) {
// iterating over list
}
list
。如果您想在迭代过程中添加项目,您需要使用ListIterator
。使用Vector
并不能绕过这个规则(显然),所以我建议使用ArrayList
代替。
CopyOnWriteArrayList
。请注意,如果您向列表中写入大量内容,则效率可能不高。