天天看點

java.util.ConcurrentModificationException【bug】

場景

集合類不安全的問題

問題

package arraylist4;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * 集合類不安全的問題
 * ArrayList
 */
public class ContainerNotSafeDemo {
    public static void main(String[] args) {
//        List<String> list= Arrays.asList("a","b","c");
//        list.forEach(System.out::println);
        List<String> list=new ArrayList<>();
//        list.add("a");
//        list.add("b");
//        list.add("c");
//
//        for (String element:list) {
//            System.out.println(element);
//        }

        //forthread10
        for (int i = 1; i <= 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
        //java.util.ConcurrentModificationException


    }
}      

解決方案

package arraylist4;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 集合類不安全的問題
 * ArrayList
 */
public class ContainerNotSafeDemo {
    public static void main(String[] args) {

        List<String> list=new CopyOnWriteArrayList<>();

        for (int i = 1; i <= 30; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
        //java.util.ConcurrentModificationException

        /*
         * 1 故障現象
         *      java.util.ConcurrentModificationException
         * 2 導緻原因
         *
         * 3 解決方案
         *   3.1 List<String> list=new Vector<>();
         *   3.2 List<String> list=Collections.synchronizedList(new ArrayList<>());
         *   3.3 List<String> list=new CopyOnWriteArrayList<>();
         *
         * 4 優化建議(同樣的錯誤不犯第2次)
         */

    }
}