far*_*ich 5 java multithreading iterator arraylist data-structures
我有存储许多对象的ArrayLists,并且经常在ArrayLists中添加和删除对象.一个线程对数据结构进行操作,每20ms左右更新一次ArrayList的对象.另一个线程遍历ArrayLists并使用它们的元素绘制对象(也是每20-30ms).
如果使用for循环遍历ArrayLists,则IndexOutOfBoundsExceptions比比皆是.如果使用迭代器遍历ArrayLists,则ConcurrentModificationExceptions比比皆是.像这样同步ArrayLists:
List list = Collections.synchronizedList(new ArrayList());
synchronized(list) {
//use iterator for traversals
}
没有例外,但有大量的性能消耗.有没有办法遍历这些ArrayLists而没有抛出异常,没有性能消耗?
谢谢!
解决这个问题的一个好方法是让线程在列表的不同副本上工作。但是,CopyOnWriteArrayList这里不太适合,因为它在每次修改时都会创建一个副本,但在您的情况下,最好减少创建副本的频率。
因此,您可以手动实现它:第一个线程创建更新列表的副本并通过变量发布它volatile,第二个线程使用此副本(我假设第一个线程仅修改列表,而不修改其中的对象):
private volatile List publicList;
// Thread A
List originalList = ...;
while (true) {
modifyList(originalList); // Modify list
publicList = new ArrayList(originalList); // Pusblish a copy
}
// Thread B
while (true) {
for (Object o: publicList) { // Iterate over a published copy
...
}
}
Run Code Online (Sandbox Code Playgroud)