Java 多线程-如何安全地从ArrayList中删除?

Java 多线程-如何安全地从ArrayList中删除?,java,multithreading,arraylist,Java,Multithreading,Arraylist,我的程序有很多线程,它们可以在任何时候通过arraylist对每个线程执行,但是arraylist中的项也可以随时删除,当arraylist被其他线程使用时,如何防止从arraylist中删除项 我非常希望能有一些解释或代码示例。不要使用ArrayList,而是使用合适的类,例如CopyOnWriteArrayList。但是,如果有大量修改(和大列表),则会影响性能。使用线程安全的ArrayList-如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改列表,则必须在外部进行

我的程序有很多
线程
,它们可以在任何时候通过arraylist对每个线程执行
,但是
arraylist中的
也可以随时删除,当
arraylist
被其他
线程使用时,如何防止从
arraylist
中删除


我非常希望能有一些解释或代码示例。

不要使用
ArrayList
,而是使用合适的类,例如
CopyOnWriteArrayList
。但是,如果有大量修改(和大列表),则会影响性能。

使用线程安全的
ArrayList
-

如果多个线程同时访问
ArrayList
实例,并且至少有一个线程在结构上修改列表,则必须在外部进行同步。(结构修改是添加或删除一个或多个元素,或显式调整支持数组大小的任何操作;仅设置元素的值不是结构修改。)这通常通过在自然封装列表的某个对象上进行同步来完成。如果不存在此类对象,则应使用
Collections.synchronizedList
方法“包装”列表。最好在创建时执行此操作,以防止意外不同步地访问列表:

   List list = Collections.synchronizedList(new ArrayList(...));

来源:

使用Collections.synchronizedList()获取列表的线程安全版本:

List<T> list = Collections.synchronizedList(yourArray);
List List=Collections.synchronizedList(yourArray);
然后在遍历列表时使用迭代器,并在迭代器上调用remove()方法以删除项:

Iterator<T> it = list.iterator();
while(it.hasNext()) {
    if(condition) {
        it.remove();
    }
}
Iterator it=list.Iterator();
while(it.hasNext()){
如果(条件){
it.remove();
}
}

使用读/写锁。实现这一点的方法有很多。同步化块,使用正确的数据结构(CopyOnWriteArrayList)、读写锁等…来自javadoc for
CopyOnWriteArrayList
(重点是我的):“这通常成本太高,但在遍历操作的数量远远超过变异时,可能比其他方法更有效,并且在无法或不想同步遍历时非常有用。“最后一点可能是最重要的。如果线程A在线程B遍历列表时修改了列表,那么线程B将遍历列表的过期版本。这样行吗?只有应用程序的设计者才能确定。这是应用程序的精确副本。