CopyOnWriteArrayList

底层

  1. 首先 CopyOnWriteArrayList内部也是通过数组来实现的,在向 CopyOnWriteArrayList 添加元素时,会复制一个新的数组,写操作在新数组上进行,读操作在原数组上进行
  2. 并且,写操作会加锁,防止出现并发写入丢数据的问题
  3. 写操作结束之后会把原数组指向新数组
  4. 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;
    }  

 

posted @ 2023-02-15 15:36  早日月薪五万  阅读(14)  评论(0编辑  收藏  举报