两个线程访问经常更新的Arraylist的问题

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而没有抛出异常,没有性能消耗?

谢谢!

axt*_*avt 4

解决这个问题的一个好方法是让线程在列表的不同副本上工作。但是,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)