CopyOnWriteArrayList 入门浅析

一、写操作

写过程中加锁,复制新的数组,覆盖原数组。

1.新增

 public boolean add(E var1) {
        ReentrantLock var2 = this.lock;
        var2.lock();

        boolean var6;
        try {
            Object[] var3 = this.getArray();
            int var4 = var3.length;
            Object[] var5 = Arrays.copyOf(var3, var4 + 1);
            var5[var4] = var1;
            this.setArray(var5);
            var6 = true;
        } finally {
            var2.unlock();
        }

        return var6;
    }

2.删除

private boolean remove(Object var1, Object[] var2, int var3) {
        ReentrantLock var4 = this.lock;
        var4.lock();

        try {
            Object[] var5 = this.getArray();
            int var6 = var5.length;
            boolean var13;
            if (var2 != var5) {
                int var7 = Math.min(var3, var6);
                int var8 = 0;

                while(true) {
                    if (var8 >= var7) {
                        if (var3 >= var6) {
                            var13 = false;
                            return var13;
                        }

                        if (var5[var3] != var1) {
                            var3 = indexOf(var1, var5, var3, var6);
                            if (var3 < 0) {
                                var13 = false;
                                return var13;
                            }
                        }
                        break;
                    }

                    if (var5[var8] != var2[var8] && eq(var1, var5[var8])) {
                        var3 = var8;
                        break;
                    }

                    ++var8;
                }
            }

            Object[] var12 = new Object[var6 - 1];
            System.arraycopy(var5, 0, var12, 0, var3);
            System.arraycopy(var5, var3 + 1, var12, var3, var6 - var3 - 1);
            this.setArray(var12);
            var13 = true;
            return var13;
        } finally {
            var4.unlock();
        }
    }

二、读操作

直接读取,无锁。

    private E get(Object[] var1, int var2) {
        return var1[var2];
    }

    public E get(int var1) {
        return this.get(this.getArray(), var1);
    }

三、总结

CopyOnWriteArrayList适合读操作(无锁)频繁,写操作(加锁)较少的场景。
CopyOnWriteArrayList线程安全,加锁的复制写操作导致效率低,同时内存占用高。
CopyOnWriteArrayList的迭代器不支持增删改。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值