集合类不安全之并发修改异常
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.Vector; public class ArrayListNotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); //List<String> list = new Vector<>(); //List<String> list = Collections.synchronizedList(new ArrayList<>()); for (int i = 0; i < 30; i++) { new Thread(() -> { list.add(UUID.randomUUID().toString().substring(0, 8)); System.out.println(list); }, String.valueOf(i)).start(); } } }
上述程序会抛java.util.ConcurrentModificationException
解决方法之一:Vector
解决方法之二:Collections.synchronizedList()
解决方法之三:CopyOnWriteArrayList(推荐)
CopyOnWrite容器即写时复制的容器。待一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Object[]进行copy,复制出一个新的容器Object[] newELements,然后新的容器Object[ ] newELements里添加元素,添加完元素之后,再将原容器的引用指向新的容器setArray (newELements)。
这样做的好处是可以对CopyOnWrite容器进行并发的读,而不需要加锁(区别于Vector和Collections.synchronizedList()),因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
浙公网安备 33010602011771号