请对比 Java 中 CopyOnWriteArrayList 与 Collections.synchronizedList 在并发场景下的差异,并说明各自的适用场景和优缺点。
考察说明
考查对 Java 并发容器同步机制和底层实现差异的理解。
回答思路
- 【回答框架 1】CopyOnWriteArrayList 采用写时复制策略,读操作无锁,写操作复制整个底层数组,适合读多写少场景。
- 【回答框架 2】Collections.synchronizedList 通过在每个方法上加 synchronized 锁(同步代码块)实现线程安全,读写都需竞争同一把锁。
- 【回答框架 3】CopyOnWriteArrayList 的迭代器是弱一致性的,不会抛出 ConcurrentModificationException;synchronizedList 的迭代器是快速失败的,需要手动加锁。
- 【回答框架 4】CopyOnWriteArrayList 内存占用高,写操作开销大;synchronizedList 读操作有锁竞争,但写开销小。
- 【关键点 1】CopyOnWriteArrayList 读多写少,无锁读;写时复制,内存占用高。
- 【关键点 2】synchronizedList 读写都加锁,适用读写均匀或写多场景。
- 【关键点 3】迭代器:CopyOnWriteArrayList 弱一致,synchronizedList fail-fast。
- 【易错点 1】不要将 CopyOnWriteArrayList 用于写多场景,否则复制成本高。
- 【易错点 2】使用 synchronizedList 迭代时需要额外加锁,否则可能抛出并发修改异常。