Collections.synchronizedList()详解

Collections.synchronizedList() 是 Java 提供的一种 线程安全包装器 ,用于给普通的 List(例如 ArrayList、LinkedList)加上一层 同步(synchronized)保护。


一、基本用法

java 复制代码
List<Integer> list = new ArrayList<>();
List<Integer> syncList = Collections.synchronizedList(list);

这样得到的 syncList 是一个 线程安全 的 List,在多线程场景下可以安全地增删改查。


二、源码解析(JDK 8)

来看 Collections 类的实现:

java 复制代码
public static <T> List<T> synchronizedList(List<T> list) {
    return (list instanceof RandomAccess ?
            new SynchronizedRandomAccessList<>(list) :
            new SynchronizedList<>(list));
}

如果底层 list 是随机访问的(例如 ArrayList),则返回 SynchronizedRandomAccessList;

否则返回 SynchronizedList。这两个类结构几乎一样,都是对原 List 加锁包装。


关键类结构(内部静态类):

java 复制代码
static class SynchronizedList<E>
    extends SynchronizedCollection<E>
    implements List<E> {

    final List<E> list;

    SynchronizedList(List<E> list) {
        super(list);
        this.list = list;
    }

    public void add(int index, E element) {
        synchronized (mutex) {
            list.add(index, element);
        }
    }

    public E get(int index) {
        synchronized (mutex) {
            return list.get(index);
        }
    }

    // 其他方法都加 synchronized(mutex)
}

三、执行流程说明

以 add() 为例:

java 复制代码
List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());
syncList.add(1);

执行过程:

1️⃣ 创建时,synchronizedList() 会把你的 ArrayList 包装成 SynchronizedList 对象。

2️⃣ 内部有一个共享锁对象 mutex(通常就是 this)。

3️⃣ 每次对 list 的操作(如 add()、get()、remove())都包裹在 synchronized (mutex) 块中。

4️⃣ 从而保证同一时间只有一个线程能访问这个列表。


四、和 CopyOnWriteArrayList 的区别

对比项 Collections.synchronizedList() CopyOnWriteArrayList
实现方式 在每个方法外层加 synchronized 锁 写时复制:写操作复制新数组
读性能 所有操作都需加锁,读性能较低 读操作无锁,非常快
写性能 写锁竞争严重(串行化) 写时复制成本高(需要复制整个数组)
适用场景 写多读少 读多写少
迭代器行为 迭代时需要手动同步,否则可能抛异常 迭代是快照,不受修改影响
底层存储 原 List 对象 内部 volatile Object[] array

✅ 五、使用迭代器的注意事项

java 复制代码
List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());

// 迭代时要手动加锁
synchronized (syncList) {
    for (Integer i : syncList) {
        System.out.println(i);
    }
}

否则,多个线程同时迭代和修改时,可能导致 ConcurrentModificationException。


✅ 六、小结

特性 synchronizedList CopyOnWriteArrayList
加锁机制 整体锁(synchronized) 写时复制(volatile + CAS)
读性能 慢(加锁) 快(无锁)
写性能 中(锁竞争) 慢(复制数组)
一致性 强一致 最终一致(读快照)
使用场景 写多读少 读多写少
相关推荐
特立独行的猫A3 分钟前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python
ikgy16 分钟前
JAVA EE:1.计算机是如何工作的
java·java-ee
.痞老板.1 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
青梅味猪大肠1 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
CoderYanger1 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)
java·数据库·spring·面试·职场和发展·java-ee·mybatis
程序员沉梦听雨1 小时前
【搜索引擎】Kibana使用指南
java·后端·学习笔记
奶油话梅糖3 小时前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
vipxieliang3 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
Rain的Java大神之路3 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
golang学习记3 小时前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发