我正在使用Vector
代替ArrayList
在多线程环境中使列表安全。但是当我尝试在迭代它时向ConcurrentModificationException
添加项目时,我会不断获得Vector
。为什么这样,我该如何预防呢?
答案 0 :(得分:9)
迭代时不能修改Vector。存储要添加到单独矢量中的项目,并在循环结束时将它们移动到Vector,或者循环遍历原始Vector的副本。
增加: 要在java中获取Vector周围的互斥锁,请在以下两个函数中执行此操作:
synchronized (list) {
// modifying list
}
和
synchronized (list) {
// iterating over list
}
当然我假设列表名为list
答案 1 :(得分:2)
如果您想在迭代时添加项目,则需要使用ListIterator
。使用Vector
,您没有绕过此规则(显然是),因此我建议您改用ArrayList
。
答案 2 :(得分:1)
如果需要迭代并同时添加到列表中,则应使用并发列表,例如CopyOnWriteArrayList
。请注意,如果你在列表中写了很多东西,它将不会非常有效。
否则,如果使用Vector或synchronizedList,则需要在迭代时保持列表的锁定。这将阻止异常,但它也会阻止并发......