CopyOnWriteArrayList—支持多线程并发的列表

总结

  • 读写分离
  • 读写同时进行的时候,读到的是旧数据
  • 写(添加、删除)的时候先把原来的容器数据拷贝一份,往拷贝出来的容器中写数据,然后再把原来的引用指向新的容器数据

代码

public E get(int index) {
        return (E) elements[index];
    }

写(同步)

添加:

    public synchronized boolean add(E e) {
        Object[] newElements = new Object[elements.length + 1];
        System.arraycopy(elements, 0, newElements, 0, elements.length);
        newElements[elements.length] = e;
        elements = newElements;
        return true;
    }

删除:

    public synchronized E remove(int index) {
        @SuppressWarnings("unchecked")
        E removed = (E) elements[index];
        removeRange(index, index + 1);
        return removed;
    }

        private void removeRange(int from, int to) {
        Object[] newElements = new Object[elements.length - (to - from)];
        System.arraycopy(elements, 0, newElements, 0, from);
        System.arraycopy(elements, to, newElements, from, elements.length - to);
        elements = newElements;
    }

猜你喜欢

转载自blog.csdn.net/mingc0758/article/details/80948173