Mutli-threading - 如何安全地从ArrayList中删除?

时间:2015-08-04 09:44:28

标签: java multithreading arraylist

我的程序有很多threads,可以随时for each throught an arraylist itemarraylist中的任何item都可以随时删除,我该怎么做当其他arraylist使用arraylist时,阻止从thread移除a1 <- c(1,2,3,76,43,8,4,5,1) a2 <- c(1,1,1,2,2,2, 3 , 3, 3) #three individuals A <- data.frame(a1,a2)

我真的很感激一些解释或代码示例。

4 个答案:

答案 0 :(得分:4)

请勿使用ArrayList,而是使用合适的类,例如CopyOnWriteArrayList。但是,如果有很多修改(和大列表),它将影响性能。

答案 1 :(得分:1)

使用ArrayList - CopyOnWriteArrayList

的线程安全变体

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

List<T> list = Collections.synchronizedList(yourArray);

然后在遍历列表的同时使用迭代器并在迭代器上调用remove()方法来删除项目:

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