Collections.synchronizedList与CopyOnWriteArrayList的区别

本文对比了CopyOnWriteArrayList与Collections.synchronizedList两种线程安全集合的实现方式,介绍了CopyOnWriteArrayList的设计思想及应用场景,并讨论了其内存占用问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • CopyOnWriteArrayList:执行修改操作时,会拷贝一份新的数组进行操作(add、set、remove等),代价十分昂贵,在执行完修改后将原来集合指向新的集合来完成修改操作,源码里面用ReentrantLock可重入锁来保证不会有多个线程同时拷贝一份数组

    • 场景:读高性能,适用读操作远远大于写操作的场景中使用(读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的, 读多写少)
  • Collections.synchronizedList:线程安全的原因是因为它几乎在每个方法中都使用了synchronized同步*锁

    • 场景:写操作性能比CopyOnWriteArrayList好,读操作性能并不如CopyOnWriteArrayList
  • CopyOnWriteArrayList的设计思想是怎样的,有什么缺点?

    设计思想:读写分离+最终一致

    缺点:内存占用问题,写时复制机制,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong GC和Full GC

### CopyOnWriteArrayList Collections.synchronizedList 的并发安全性及性能对比 #### 并发安全性分析 `CopyOnWriteArrayList` 是一种通过写时复制机制来实现线程安全的集合类。它的核心思想是在每次修改操作(如 `add`, `remove` 等)时创建一个新的底层数组副本,从而避免了对原数组的直接修改[^1]。这种方式使得读操作无需加锁即可完成,极大地提高了多线程环境下的读取效率。 相比之下,`Collections.synchronizedList` 则通过对底层列表对象的方法进行同步封装来提供线程安全保障。具体来说,它会在每个方法调用前后自动加上 `synchronized` 锁,无论是读还是写操作都需要获取该锁才能执行[^4]。这种设计虽然简单易懂,但在高并发环境下可能会成为瓶颈,尤其是当存在大量争抢同一把锁的情况时。 #### 性能比较 从性能角度来看,两者各有千秋: - **读操作** 对于只读或者以读为主的场景而言,`CopyOnWriteArrayList` 明显优于 `Collections.synchronizedList` 。由于前者允许无锁访问数据结构,所以在多线程并行读取时几乎不会发生阻塞现象;后者则因需频繁申请释放锁而导致额外开销较大[^3]。 - **写操作** 然而,在涉及频繁更新的数据集上,则应优先考虑采用 `Collections.synchronizedList` ,因为它不需要像 `CopyOnWriteArrayList` 那样每次都重新分配内存空间以及拷贝整个数组内容到新位置去。尽管如此,如果能够合理调整业务逻辑减少不必要的全表扫描动作的话(比如引入分段锁技术),那么即使面对较高强度的工作负载也依然可以接受使用 `CopyOnWriteArrayList`. 另外值得注意的是,随着 JDK 版本不断演进,部分内置容器可能已经得到了进一步优化改进,实际测试结果或许会有所差异,因此建议开发者们依据自己项目具体情况做针对性评估后再决定选用哪一类解决方案最为合适[^5]。 ```python import java.util.*; import java.util.concurrent.*; public class Test { public static void main(String[] args){ List<Integer> syncList = Collections.synchronizedList(new ArrayList<>()); List<Integer> cowList = new CopyOnWriteArrayList<>(); // Example of adding elements to both lists. for(int i=0;i<100;i++) { syncList.add(i); cowList.add(i); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值