Collections.synchronizedList通过同步方法实现线程安全,但迭代需手动加锁,适用于读多写少场景,高并发下性能不如CopyOnWriteArrayList。

在多线程环境下,普通的 ArrayList 是不安全的,多个线程同时读写可能导致数据不一致或抛出异常。Java 提供了 Collections.synchronizedList 方法来包装非线程安全的 List,使其在特定条件下线程安全。
什么是 Collections.synchronizedList?
这个方法属于 java.util.Collections 工具类,用于将一个普通的 List 包装成线程安全的版本。它通过在每个公开方法上加同步锁(synchronized)来保证原子性。使用方式如下:
Listlist = Collections.synchronizedList(new ArrayList<>());
此时,list 的 add、get、remove 等基本操作都是同步的,可以在多线程中安全调用。
需要注意的坑:迭代仍需手动同步
虽然 synchronizedList 保证了单个方法的线程安全,但复合操作(如遍历、条件判断+添加)仍然需要外部加锁,否则可能出错。例如,遍历时如果不加锁,可能抛出 ConcurrentModificationException 或读到不一致的数据:
BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛
立即学习“Java免费学习笔记(深入)”;
synchronized (list) {
for (String item : list) {
System.out.println(item);
}
}
官方文档明确指出:对返回的列表进行**迭代时必须手动同步**,推荐在 synchronized 块中进行。
适用场景与局限性
synchronizedList 适合低并发、读多写少的场景。它的实现简单,但性能较差,因为整个列表的方法都使用同一把锁,写操作会阻塞所有其他操作。- 优点:使用简单,兼容所有 List 实现,适合快速改造旧代码。
- 缺点:性能瓶颈明显,高并发下不如 CopyOnWriteArrayList 或 ConcurrentHashMap(作为替代方案考虑)。
和 CopyOnWriteArrayList 对比
CopyOnWriteArrayList 是另一种线程安全的 List 实现,适用于读远多于写的场景。- synchronizedList:读写共用锁,每次操作都加锁,适合写操作较少但不能接受复制开销的情况。
- CopyOnWriteArrayList:写操作复制整个数组,读操作无锁,适合读频繁、写极少的场景(如监听器列表)。
如果写操作较频繁,CopyOnWriteArrayList 的复制成本高,反而不如 synchronizedList。
基本上就这些。使用 Collections.synchronizedList 能让 List 基本操作线程安全,但别忘了手动同步复合操作。








