【08】同步容器 VS ConcurrentModificationExceotion
java 集合框架有 List Set Queue Map ,而前三个是实现了Collection 接口
所以就有了传说中的同步容器 包装了一层同步锁 ,Vector Stack HashTable
这时候 会在迭代遍历时产生一个问题,就是ConcurrentModificationException (同步修改异常)
产生是因为迭代器,在一次内部元素修改时,会被修改,然后就throw Exception
看代码
package Concurrency.mid; import leetcoder.ListNode; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Test { public static void main(String[]arg){ List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); System.out.println(list); /* // 方式 1 Exception in thread "main" java.util.ConcurrentModificationException Iterator it = list.iterator(); while(it.hasNext()){ String s = (String) it.next(); if(s=="1"){ list.remove(s); } } //方式二 for(Iterator it2 = list.iterator();it2.hasNext();){ String s = (String)it2.next(); if(s == "1") { list.remove(s); } } //方式三 for(String s :list){ if(s=="1"){ list.remove(s); } } */ /** 解决方案 使用迭代器 删除*/ for(Iterator it2 = list.iterator();it2.hasNext();){ String s = (String)it2.next(); if(s == "1") { it2.remove(); } } System.out.println(list); // 二 使用removeAll 删除 List list2 = new ArrayList(); list2.add("2"); list.removeAll(list2); System.out.println(list); // 三 使用 CopyOnWriteArrayList List list3 = new CopyOnWriteArrayList(); list3.add("1"); list3.add("2"); list3.add("3"); list3.add("4"); Iterator it4 = list3.iterator(); while(it4.hasNext()){ String s = (String)it4.next(); if(s=="1"){ list3.remove(s); } } //四 使用索引下标 for(int i=0;i<list3.size();i++){ String s = (String) list3.get(i); if(s=="2"){ list3.remove(s); --i; } } } }
解决方案
1.使用迭代器删除
2.记录然后删除
3.使用CopyOnWriteArrayList 容器
4.使用索引下标(此时不涉及迭代器,所以适用于多线程)
不摸着石头过河,难道要在温柔乡睡到天昏地暗。