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   upupup-999  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?



点击右上角即可分享
微信分享提示