【发布时间】:2011-08-03 07:08:09
【问题描述】:
我有存储许多对象的 ArrayLists,并且经常在 ArrayLists 中添加和删除对象。一个线程对数据结构进行操作,每 20 毫秒左右更新一次 ArrayList 的对象。另一个线程遍历 ArrayLists 并使用它们的元素来绘制对象(也是每 20-30 毫秒)。
如果使用 for 循环遍历 ArrayList,则 IndexOutOfBoundsExceptions 比比皆是。如果使用迭代器遍历 ArrayList,则 ConcurrentModificationExceptions 比比皆是。像这样同步 ArrayLists:
List list = Collections.synchronizedList(new ArrayList());
synchronized(list) {
//use iterator for traversals
}
不抛出异常,但会消耗大量性能。有没有办法遍历这些 ArrayLists 而不会抛出异常并且不会消耗性能?
谢谢!
【问题讨论】:
-
是的,你有线程错误,你很幸运能得到你的例外。第一个线程做了哪些修改?某些范例比其他范例更容易使线程安全。如果列表很小,可以考虑
CopyOnWriteArrayList。 -
我使用了 CopyOnWriteArrayList,似乎运行良好。但是,当我使用迭代器遍历列表时,对 remove(object) 的调用会引发 UnsupportedOperationException。 for 循环通过它没有问题。
-
如果要从遍历过程中确定的 CopyOnWriteArrayList 中删除对象,请将它们全部保存在单独的集合中,并在完成后调用 removeAll()。
-
我怀疑您需要在“绘画”代码中对列表进行结构修改。您需要进一步解耦两个线程,否则由于线程之间的同步,您将陷入性能不佳的困境。如果您发布代码的简化版本,也许人们可以帮助您重新组织它。
标签: java multithreading data-structures iterator arraylist