Java面试题06-CopyOnWriteArrayList的底层原理

CopyOnWriteArrayList是一种线程安全的列表,通过复制原数组来实现并发写入。在写操作时,它会创建一个新的数组副本,进行修改后再指向新数组,从而保证读操作不会受写操作的影响,提高了读性能。但其缺点是内存消耗大且数据可能存在延迟。适用于读多写少且不强求数据实时性的场景。
摘要由CSDN通过智能技术生成

Java面试题06-CopyOnWriteArrayList的底层原理

1、首先的话CopyOnWriteArrayList的底层也是通过数组来实现的,在向CopyOnWriteArrayList添加元素时,会复制一个新的数组并且将CopyOnWriteArrayList的数据存储数组指向它,写操作在新的数组上进行,读操作在原数组上进行。

//CopyOnWriteArrayList的底层数组
private transient volatile Object[] array;

2、写操作会加锁,防止出现并发写入丢失数据的问题。并且,写操作在结束之后会把元素组指向新的数组。

	// 添加元素的操作
	public boolean add(E var1) {
		// 加锁操作
        ReentrantLock var2 = this.lock;
        var2.lock();

        boolean var6;
        try {
            Object[] var3 = this.getArray();
            int var4 = var3.length;
            //复制原来的数组到新数组,新数组长度是原数组长度 + 1
            Object[] var5 = Arrays.copyOf(var3, var4 + 1);
            //将元素赋值给数组最后一个元素
            var5[var4] = var1;
            //指向CopyOnWriteArrayList的底层数组
            this.setArray(var5);
            var6 = true;
        } finally {
        	//解锁
            var2.unlock();
        }

        return var6;
    }
	// 获取元素
	public E get(int index) {
		// 直接返回数据数组中该下标的元素
        return this.get(this.getArray(), index);
    }

3、CopyOnWriteArrayList允许在写操作时来读取数据,大大提高了读的性能,因此适合读多写少的应用场景,但是CopyOnWriteArrayList会比较占用内存,同时读取到的数据不是实时最新的数据,所以不适合实时性要求很高的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值