如果要进行remove
操作,可以调用迭代器的remove方法
而不是集合类的 remove 方法。因为如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身remove/add
方法,迭代器都将抛出一个ConcurrentModificationException
,这就是单线程状态下产生的 fail-fast 机制。
fail-fast 机制 :多个线程对 fail-fast 集合进行修改的时,可能会抛出ConcurrentModificationException,单线程下也会出现这种情况,上面已经提到过。
java.util
包下面的所有的集合类都是fail-fast的,而java.util.concurrent
包下面的所有的类都是fail-safe的。
不要在foreach
循环中进行remove/add
操作,remove请使用Iterator方法,如果并发操作,需要对Iterator对象加锁
正例
List<String> list =new ArrayList<>();
list.add("1");
list.add("2");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String item = iterator.next();
if (删除条件){
iterator.remove();
}
}
反例
for(String item:list){
if("1".equals(item)){
list.remove(item);
}
}
评论区