- HashMap、arralist、linkedlist、vector不允许通过Iterator遍历的同时修改,而ConcurrentHashMap允许该行为,并且该更新对后续的遍历可见
public class Qiao { public static class T1 extends Thread { private List<Integer> list; public T1(List<Integer> list) { this.list = list; } public void run() { for (Integer i : list) { } } } public static class T2 extends Thread { private List<Integer> list; public T2(List<Integer> list) { this.list = list; } public void run() { for (int i = 0; i < list.size(); i++) { list.remove(i); } } } public static void main(String[] args) { List<Integer> list = new Vector<Integer>(); for (int i = 0; i < 10000; i++) { list.add(i); } T1 t1 = new T1(list); T2 t2 = new T2(list); t1.start(); t2.start(); } }
结果:
Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.util.Vector$Itr.checkForComodification(Vector.java:1184)
at java.util.Vector$Itr.next(Vector.java:1137)
at cn.quantgroup.pinjamancepat.controller.Qiao$T1.run(Qiao.java:19)
Process finished with exit code 0
public class Qiao2 { public static class T1 extends Thread { private Map map; public T1(Map map) { this.map = map; } public void run() { for (Object a : map.entrySet()) { } } } public static class T2 extends Thread { private Map map; public T2(Map map) { this.map = map; } public void run() { for (Object a : map.keySet()) { map.remove(a); } } } public static void main(String[] args) { Map map = new ConcurrentHashMap(); for (int i = 0; i < 10000; i++) { map.put(i, i + 1); } T1 t1 = new T1(map); T2 t2 = new T2(map); t1.start(); t2.start(); } }
结果:Process finished with exit code 0