- CopyOnWriteArrayList是ArrayList线程安全的一种实现。CopyOnWrite也叫写诗复制容器,从字面看也就是先复制一份,然后再进行写操作。
- 在进行元素修改的时候,会先将数组拷贝一份,在拷贝的数组上进行更改,然后再将新数组更新到原来的引用上面。数组的拷贝主要使用System.arraycpoy和Arrays.copyOf.
- 在add,set,remove等方法都加了可重入锁,这样写操作就不能并发,但是在写时候还可以进行读操作,不过读到的数据是旧数据。
- CopyOnWriteArrayList有一个专属的迭代器,COWiterator。如果使用原生iterator迭代器,在迭代器里面对元素进行操作就会触发UnsupportedOperationException异常。
优点:
- CopyOnWriteArrayList适用于读多写少的情况,比如商品列表。
缺点:
- 内存占用大,因为写诗复制需要额外拷贝一份,需要双倍内存。
- 数据修改时间长,随着数组元素增加,进行数组拷贝会越来越慢。
- 数据一致性问题,因为使用写诗复制技术,因此只能确保最终的结果是一致的,不能保证数据的实时性。