我有一个预先填充的数组列表。并且我有多个线程可以从数组列表中删除元素。每个线程调用下面的remove方法,并从列表中删除一项。下面的代码给了我一致的行为吗?
ArrayList<String> list = Collections.synchronizedList(new ArrayList<String>());
void remove(String item)
{
do something; (doesn't work on the list)
list.remove(item);
}
谢谢!
发布于 2012-07-06 18:32:09
只要你不要求"remove“方法是原子的,这应该没问题。
换句话说,如果“做某事”检查项目在列表中出现不止一次,那么当您到达下一行时,该检查的结果可能是错误的。
此外,确保在迭代时在列表上进行同步:
synchronized(list) {
for (Object o : list) {}
}
正如Peter Lawrey所提到的,CopyOnWriteArrayList可以让您的工作更轻松,并且可以在高度并发的环境中提供更好的性能。
发布于 2012-11-01 04:59:29
列表可能有两个不同的问题:
1)如果您在迭代中进行修改,即使是在单线程环境中,您也将拥有如下示例中的ConcurrentModificationException:
List<String> list = new ArrayList<String>();
for (int i=0;i<5;i++)
list.add("Hello "+i);
for(String msg:list)
list.remove(msg);
因此,为了避免这个问题,您可以这样做:
for(int i=list.size()-1;i>=0;i--)
list.remove(i);
2)第二个问题可能是多线程环境。如上所述,您可以使用同步(列表)来避免异常。
发布于 2012-07-06 18:37:43
它将为添加/删除操作提供一致的行为。但在迭代时,您必须显式同步。Refer this link
https://stackoverflow.com/questions/11360401
复制相似问题