java.util.ConcurrentModificationException (并发修改异常)
ArrayList 多线程时的错误¶
List<String> list = new ArrayList<>();
for (int i = 0; i < 300; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,2));
System.out.println(list);
}, String.valueOf(i)).start();
}
异常:
java.util.ConcurrentModificationException
故障现象¶
java.util.ConcurrentModificationExeption
导致原因¶
线程A修改过程中,线程B也在修改,导致数据不一致。
解决方案¶
new VectorList<Object> list = Collections.synchronizedList(new ArrayList<>());jdk1.2- J.U.C
java.util.concurrent.CopyOnWriteArrayList - 数组使用的是
volatile修饰; - 操作修改时使用
synchronized代码块;
优化建议(同样的错误不会出现第二次)¶
Map 多线程错误¶
解决方法¶
ConcurrentHashMap<>();