定义:
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;
//看到这里的数组