底层实现采用了 写入时拷贝 的思想,增删改操作会将底层数组拷贝一份,更改操作在新数组上执行,这时不影响其它线程的并发读,读写分离。

    1. public boolean add(E e) {
    2. synchronized (lock) {
    3. // 获取旧的数组
    4. Object[] es = getArray();
    5. int len = es.length;
    6. // 拷贝新的数组(这里是比较耗时的操作,但不影响其它读线程)
    7. es = Arrays.copyOf(es, len + 1);
    8. // 添加新元素
    9. es[len] = e;
    10. // 替换旧的数组
    11. setArray(es);
    12. return true;
    13. }
    14. }

    其它读操作并未加锁

    1. public void forEach(Consumer<? super E> action) {
    2. Objects.requireNonNull(action);
    3. for (Object x : getArray()) {
    4. @SuppressWarnings("unchecked") E e = (E) x;
    5. action.accept(e);
    6. }
    7. }

    image.png