java常见集合的并发修改异常(Java.util.ConcurrentModificationException)解决方案

492 阅读1分钟

ArrayList、HashSet、HashMap是我们常用的三个集合,但是如果同一个集合对象被多个线程调用时,很容易出现Java.util.ConcurrentModificationException并发修改异常

一、解决ArrayList并发问题

有如下解决方案

VectorCollections.synchronizedList()CopyOnWriteArrayList()
原理synchronizedsynchronizedLock
相对性能
public static void main(String[] args) {
    /**
     * List<String> list = new ArrayList<>(); 不安全
     * 【解决方案】
     * 1、List<String> list = Collections.synchronizedList(new ArrayList<>());
     * 2、List<String> list = new Vector<>();
     * 3、List<String> list = new CopyOnWriteArrayList<>();
     */
    List<String> list = new CopyOnWriteArrayList<>();
    for (int i = 0; i < 20; i++) {
        new Thread(() -> {
            list.add(UUID.randomUUID().toString().substring(0, 5));
            System.out.println(list);
        }).start();
    }
}

二、解决HashSet并发问题

有如下解决方案

Collections.synchronizedSet()CopyOnWriteArraySet()
原理synchronizedLock
相对性能
public static void main(String[] args) {
    /**
     * Set<String> set = new HashSet<>(); 不安全
     * 【解决方案】
     * 1、Set<String> set = Collections.synchronizedSet(new HashSet<>());
     * 2、Set<String> set = new CopyOnWriteArraySet<>();
     */
    Set<String> set = new CopyOnWriteArraySet<>();
    for (int i = 0; i < 20; i++) {
        new Thread(() -> {
            set.add(UUID.randomUUID().toString().substring(0, 5));
            System.out.println(set);
        }).start();
    }
}

三、解决HashMap并发问题

有如下解决方案

HashTableCollections.synchronizedMap()ConcurrentHashMap()
原理synchronizedsynchronizedLock
相对性能
public static void main(String[] args) {
    /**
     * Map<String> map = new HashMap<>(); 不安全
     * 【解决方案】
     * 1、
     * 2、Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
     * 3、Map<String, String> set = new ConcurrentHashMap<>();
     */
    Map<String, String> map = new ConcurrentHashMap<>();
    for (int i = 0; i < 20; i++) {
        new Thread(() -> {

        }).start();
    }
}


好啦,以上!