CopyOnWrite分析

CopyOnWrite是一种写时复制的并发机制,用于实现读多写少的场景。它通过在修改时复制底层数组来确保并发读操作的不间断。在Java的`concurrent`包中有`CopyOnWriteArrayList`和`CopyOnWriteArraySet`两种实现。读操作如size()、indexOf()等无须加锁,而写操作如set()、add()会加锁并复制数组。由于可能存在读旧数据的情况,因此CopyOnWrite不保证实时性,但保证最终一致性。适用场景需权衡读取延迟与数据一致性需求。
摘要由CSDN通过智能技术生成

定义:

CopyOnWrite机制称为写时复制,理解起来很简单,就是执行修改操作时进行底层数组复制,使得修改操作在新的数组上进行,不妨碍原数组的并发读操作,复制修改完成后更新原数组引用变量。

原理:

每个修改之前都加上ReentrantLock使并发写操作互斥执行,避免多次数据复制修改。所以能够实现读写分离,但是写写同步执行。读写并发环境中,在将原数组对象引用变量更新为复制修改完成后的数组对象之前,读的数组对象和写的数组对象可能不一致,所以不能保证实时数据一致性,只能保证最终一致性。

实现:

在concurrent包下CopyOnWrite机制的实现有两种,CopyOnWriteArrayList和CopyOnWriteArraySet。其实CopyOnWriteArraySet就是一个CopyOnWriteArrayList,不过就是在方法中避免重复数据而已,甚至这些避免重复数据的函数也是在CopyOnWriteArrayList中定义的,CopyOnWriteArraySet中只是包含一个CopyOnWriteArrayList的属性,然后在方法上做个包装,除了equals方法外,其他当前类中的所有函数都是调用的CopyOnWriteArrayList的方法,所以严格来讲可以使用一个CopyOnWriteArrayList作为具有Set特性的写时复制数组(不过就是没有继承AbstractSet)。

CopyOnWriteArrayList中的属性:

//序列化序列号,不定义的话,会自动生成
private static final long serialVersionUID = 8673264195747942595L;
transient final ReentrantLock lock = new ReentrantLock();
private volatile transient Object[] array;
//看到这里的数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值