CopyOnWriteArrayList简单了解

常用方法

/** The lock protecting all mutators */
final transient ReentrantLock lock = new ReentrantLock();

    /** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;

    /**
     * Gets the array.  Non-private so as to also be accessible
     * from CopyOnWriteArraySet class.
     */
final Object[] getArray() {
        return array;
    }
    
final void setArray(Object[] a) {
        array = a;
	}
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();
        }
    }
public E remove(int index) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            E oldValue = get(elements, index);
            int numMoved = len - index - 1;
            if (numMoved == 0)
                setArray(Arrays.copyOf(elements, len - 1));
            else {
                Object[] newElements = new Object[len - 1];
                System.arraycopy(elements, 0, newElements, 0, index);
                System.arraycopy(elements, index + 1, newElements, index,
                                 numMoved);
                setArray(newElements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }

add() 执行过程:

  1. 先加锁,作用是只能有一个线程能够添加
  2. 用Arrays.copy() 复制一份原数组
  3. 直接在新的数组后添加新的元素
  4. setArray(newElements) 将array 指向新的数组
  5. 释放锁

remove() 执行过程:
1. 先加锁
2. int numMoved = len - index - 1;判断numMoved 是否等于0相当于判断要删除的元素是否是最后一3,如果是则直接将原来的数组的长度减少1
4. 不是则先复制 index 前面的再复制index后面
5. 将array 指向新数组
6.释放锁

优缺点

优点:

  • 解决多线程并发问题
  • 适合读多写少的场景
    缺点:
  • 复制数组需要占用大量内存
  • 当有一个线程在进行添加操作时,另一个线程读取到的时旧的数据,并不是最新的数据,只是最终一致性,不是实时性数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值