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

时间:2013-03-15 16:44:21

标签: java multithreading vector synchronized

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

3 个答案:

答案 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,则需要在迭代时保持列表的锁定。这将阻止异常,但它也会阻止并发......