大多数业务场景都是一种“读多写少”的情景,CopyOnWriteArrayList就是为适应这种场景而诞生的。
运用了一种“写时复刻”的思想,当我们需要修改列表中的元素时,先将列表copy,然后在副本修改,修改完成后再将引用从原列表指向新列表。
这样做的好处是读/写不会冲突,可以并发进行,读操作还是在原列表,写操作在新列表。仅仅当有多个线程同时进行写操作时,才会进行同步。
该类存在的一些问题:
1. 内存的使用
由于CopyOnWriteArrayList使用了“写时复制”,所以在进行写操作的时候,内存里会同时存在两个array数组,如果数组内存占用的太大,那么可能会造成频繁GC,所以CopyOnWriteArrayList并不适合大数据量的场景。
2. 数据一致性
CopyOnWriteArrayList只能保证数据的最终一致性,不能保证数据的实时一致性——读操作读到的数据只是一份快照。所以如果希望写入的数据可以立刻被读到,那CopyOnWriteArrayList并不适合。
具体原理及使用示例请查看https://segmentfault.com/a/1190000016214572