并发包中的并发 List 只有 CopyOnWriteArrayList。CopyOnWriteArrayList 是一个线程安全的 ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。Copy On WriteArraylist 的类图结构如图 5-1 所示。
图 5-1
在 CopyOnWriteArrayList 的类图中,每个 CopyOnWriteArrayList 对象里面有一个 array 数组对象用来存放具体元素,ReentrantLock 独占锁对象用来保证同时只有一个线程对 array 进行修改。这里只要记得 ReentrantLock 是独占锁,同时只有一个线程可以获取就可以了,后面会专门对 JUC 中的锁进行介绍。
如果让我们自己做一个写时复制的线程安全的 list 我们会怎么做,有哪些点需要考虑?
● 何时初始化 list,初始化的 list 元素个数为多少,list 是有限大小吗?
● 如何保证线程安全,比如多个线程进行读写时如何保证是线程安全的?
● 如何保证使用迭代器遍历 list 时的数据一致性?
下面我们看看 CopyOnWriteArrayList 的作者 Doug Lea 是如何设计的。