JUC_CopyOnWrite

什么是CopyOnWrite?

CopyOnWtire意为写入时复制

1.准备写入前,将旧数据复制一份作为副本,在副本上进行写入

2.写入完成后,用副本的引用替换旧数据的引用

所以在整个写入过程中,读取到的数据都是不变的,只有在写入完成后,新的读取操作所读取到的数据才会发生改变,从而保证了数据的最终一致性(注意,不是实时一致性)

以CopyOnWriteArrayList为例

    //volatile保证了数据的可见性
    //数据被任一线程修改 其余线程均可见(直接从内存中读取数据 而不是缓存中)
    private transient volatile Object[] array;
    
    public boolean add(E e) {
        //锁
        final ReentrantLock lock = this.lock;
        //上锁
        lock.lock();
        try {
            //创建副本
            Object[] elements = getArray();
            //数组扩容 在原先容量上 + 1
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            //写入
            newElements[len] = e;
            //替换引用
            setArray(newElements);
            return true;
        } finally {
            //解锁
            lock.unlock();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值