我正在使用Vector
而不是ArrayList
在多线程环境中使列表安全。ConcurrentModificationException
但是当我尝试Vector
在迭代时添加项目时,我不断得到它。为什么会这样,我该如何预防?
问问题
7516 次
3 回答
9
您不能在迭代 Vector 时对其进行修改。将要添加的项目存储在单独的向量中,并在循环完成时将它们移动到向量中或在原始向量的副本上循环。
添加:要在 java 中获取 Vector 周围的互斥锁,请在两个函数中执行此操作:
synchronized (list) {
// modifying list
}
和:
synchronized (list) {
// iterating over list
}
当然,我假设该列表已命名list
于 2013-03-15T16:46:03.953 回答
2
如果您想在迭代时添加项目,您将需要使用ListIterator
. 通过使用Vector
,你并没有绕过这个规则(显然),所以我建议使用ArrayList
。
于 2013-03-15T16:47:10.040 回答
2
如果您需要迭代并同时添加到您的列表中,您应该使用并发列表,例如CopyOnWriteArrayList
. 请注意,如果您在列表中写入很多内容,则效率不会很高。
否则,如果使用 Vector 或 synchronizedList,则需要在迭代时保持列表的锁定。这将防止异常,但也会防止并发......
于 2013-03-15T16:56:53.143 回答