【Java】CopyOnWriteArrayList
一,概述
CopyOnWriteArrayList作为List接口的实现之一,它区分于ArrayList在于它是线程安全的。如它名字一样,所有的写操作均复制了原数组的值,虽说代价较大,但读多写少的环境下,是可接受的。笔者在此简单看下实现原理。
二,实例
三,实现
承载数据存储的数组,便是array成员,其声明了volatile,让其具备原子性、可见性,
1,add
2,get
读是无锁操作,因为写操作仅会复制array,不会对读产生任何影响,这是重点,
且array声明了volatile,写操作完毕后,是可直接拿到已经改变的array。
3,set
set通过clone方式,创建一个副本
4,iter
设计模式中行为性迭代器设计模式,此处当然必不可少,
hasNext,next均无锁操作,
CopyOnWriteArrayList#Iter是不支持remove,set,add方法实现,毕竟遍历此List,只在读的情况下。并且在iter期间,突然的写操作,是无法影响此Iter,毕竟已经存了snapshot,写操作的array已经是新值。换句话说,Iter后,不管原CopyOnWriteArrayList内部值如何变化,均不会影响此Iter,snapshot已经独立。