CopyOnWriteArrayList
底层
- 首先 CopyOnWriteArrayList内部也是通过数组来实现的,在向 CopyOnWriteArrayList 添加元素时,会复制一个新的数组,写操作在新数组上进行,读操作在原数组上进行
- 并且,写操作会加锁,防止出现并发写入丢数据的问题
- 写操作结束之后会把原数组指向新数组
- CopyOnWriteArrayList允许在写操作时来读取数据,大大提高了读的性能,因此适合读多写少的应用场景,但是CopyOnWriteArrayList会比较占内存,同时可能读到的数据并不是实时更新的最新数据,所以不适合实时性要求很高的场景
源码
public boolean add(E e) { //加锁 final ReentrantLock lock = this.lock; lock.lock(); try { //获取原数组 Object[] elements = getArray(); //原数组长度 int len = elements.length; //复制一个新数组,长度是原长度+1 Object[] newElements = Arrays.copyOf(elements, len + 1); // 将数据放到新数组中 newElements[len] = e; //将新数组赋值给自己 setArray(newElements); return true; } finally { lock.unlock(); } } final void setArray(Object[] a) { array = a; }