• CopyOnWriteArrayList源码add加锁的意义


    源码

    /**
    * Appends the specified element to the end of this list.
    *
    * @param e element to be appended to this list
    * @return {@code true} (as specified by {@link Collection#add})
    */
    public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
    newElements[len]
    = e; setArray(newElements); return true; } finally { lock.unlock(); } }

    网上看到的解释

    网上关于CopyOnWriteArrayList的文章大多拷贝自http://ifeve.com/java-copy-on-write/ ,原文对这个疑问的解释如下:

    我的理解

    这里我觉得这原文的解释不太清晰或不太合理,我的思考是:

    add的流程“是复制当前数组获得新数组 -> 将元素放到新数组末尾 -》更新数组引用,将其指向新的内存”

    如果没有加锁,那么多个线程并发add的时候拿的容器数组不一定是最新的,导致的结果是有些线程add的结果被紧随其后的线程add操作覆盖掉,如下图

  • 相关阅读:
    重写Override和重加载Overload
    Java 继承
    poj 3263 Tallest Cow
    矩阵求和
    全排列
    最大乘积
    三角形面积
    Sum
    搭积木
    调手表
  • 原文地址:https://www.cnblogs.com/ming-szu/p/11143255.html
Copyright © 2020-2023  润新知