基础

new ArrayList 底层是new一个数组,初始数组大小是10
1648452212(1).png
image.png

  • 超过10, 扩容,原来大小的一半

image.png

  • 线程不安全

    add方法

    image.png

    故障现象

    并发时可能出现 java.util.ConcurrentModificationException

    故障原因

    并发争抢修改导致

    解决方案

  • 使用Vector

    Vector since JDK1.0 ; ArrayList since JDK 1.2 Vector add 方法加上Synchorinzed, 性能比较差

  • Collections

    List<_String> list = Collections._synchronizedList(_Arrays._asList(“a”, “b”, “c”));

  • CopyOnWriteArrayList 写时复制

    List<_String> list2 = new CopyOnWriteArrayList<>()_;

优化建议

CopyOnWriteArrayList源码分析

image.png
1648453572(1).png
写时复制—读写分离的思想

往一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器的Object[]进行copy, 再复制出一个新的容器Object[] newElements, 然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。 这样做的好处时可以对copyonwrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。