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(); } }
 
                    
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号