跳转至

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也在修改,导致数据不一致。

解决方案

  1. new Vector
  2. List<Object> list = Collections.synchronizedList(new ArrayList<>()); jdk1.2
  3. J.U.C java.util.concurrent.CopyOnWriteArrayList
  4. 数组使用的是volatile修饰;
  5. 操作修改时使用synchronized代码块;

优化建议(同样的错误不会出现第二次)

Map 多线程错误

解决方法

  1. ConcurrentHashMap<>();