1.list不安全

package com.mydemo;

import java.util.ArrayList;
import java.util.UUID;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;

public class ArrayListNotSafeDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        //Vector<String> list = new Vector<>();
        //CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);

            },String.valueOf(i)).start();
        }
    }
}

2.执行结果

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at java.util.AbstractCollection.toString(AbstractCollection.java:461)
    at java.lang.String.valueOf(String.java:2994)
    at java.io.PrintStream.println(PrintStream.java:821)
    at com.mydemo.ArrayListNotSafeDemo.lambda$main$0(ArrayListNotSafeDemo.java:16)
    at java.lang.Thread.run(Thread.java:745)

 

上述程序会抛java.util.ConcurrentModificationException

解决方法之一:Vector

解决方法之二:Collections.synchronizedList()

解决方法之三:CopyOnWriteArrayList:写时复制,主要是一种读写分离的思想

 

3.CopyOnWriteArrayList源码

 public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }

 

posted on 2022-04-06 23:16  upupup-999  阅读(34)  评论(0)    收藏  举报