CopyOnWriteArrayList 是什么
CopyOnWriteArrayList 是 Java 并发包 java.util.concurrent 中提供的并发容器,本质上是一个线程安全且读操作无锁的 ArrayList。它在确保线程安全的前提下,通过牺牲写操作的效率来保证读操作的高效。
所谓 CopyOnWrite 就是通过复制的方式来完成对数据的修改,在修改时复制一个新的数组,在上面进行修改,不会对旧的数组进行改变,也就没有读写数据不一致的问题了。
CopyOnWriteArrayList 优缺点
优点
- 读操作性能高
因为无需任何同步措施,比较适用于读多写少的并发场景。
- 迭代器遍历不会抛出异常
遍历 ArrayList 时,若中途有别的线程对其修改,则会抛出 ConcurrentModificationException 异常。而 CopyOnWriteArrayList 由于其"读写分离"的思想,它的遍历和修改操作分别作用在不同的 list 容器上,所以在使用迭代器遍历时,不会抛出 ConcurrentModificationException 异常。
缺点
- 内存占用大
每次执行写操作都要将原容器拷贝一份,数据量大时,对内存压力较大,可能会引起频繁GC;
- 无法保证实时性
CopyOnWriteArrayList 的写和读分别作用在新老不同容器上,在写操作执行过程中,读不会阻塞,所以读取到的是老容器的数据,无法保证数据的实时