15

我正在使用Vector而不是ArrayList在多线程环境中使列表安全。ConcurrentModificationException但是当我尝试Vector在迭代时添加项目时,我不断得到它。为什么会这样,我该如何预防?

4

3 回答 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 回答