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