
JUC
我们知道ArrayList是线程不安全的
众所周知,ArrayList时线程不安全的,那么有没有什么方法,既保证了
AllrayList的高并发,又保证了线程安全呢?我编写了一个案例,并给出了解决方案。
案例
1 | /** |
当多线程执行ArrayList.add()方法时,会报错
1 | java.util.ConcurrentModificationException |
解决方案 一、
1 | List<String> list = new Vector<>(); |
解决方案 二、
限制不可以使用Vector和Collections工具类
JUC包中有个类叫CopyOnWriteArrayList<E>
为什么CopyOnWriteArrayList可以保证线程安全呢? 来看看源码
1 | public class CopyOnWriteArrayList<E> |
CopyOnWrite容器即写时复制的容器。往一个容器中添加元素时,不直接往房钱容器object[ ]对象添加,而是先将当前容器object[ ]进行Copy,复制出一个新的容器Object[ ] newElements,然后向新的容器中添加元素,添加完元素之后,再将原容器的引用指向新的容器 setArray(newElements);。这样做的好处是可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当情容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想。