Collections.synchronizedList()详解

Collections.synchronizedList() 是 Java 提供的一种 线程安全包装器 ,用于给普通的 List(例如 ArrayListLinkedList)加上一层 同步(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)
读性能 慢(加锁) 快(无锁)
写性能 中(锁竞争) 慢(复制数组)
一致性 强一致 最终一致(读快照)
使用场景 写多读少 读多写少
相关推荐
孟陬3 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌3 小时前
一站式了解四种限流算法
java·后端·go
华仔啊3 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
也些宝4 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java
Nyarlathotep01135 小时前
SpringBoot Starter的用法以及原理
java·spring boot
wuwen55 小时前
WebFlux + Lettuce Reactive 中 SkyWalking 链路上下文丢失的修复实践
java
SimonKing5 小时前
GitHub 10万星的OpenCode,正在悄悄改变我们的工作流
java·后端·程序员
Seven976 小时前
虚拟线程深度解析:轻量并发编程的未来趋势
java
雨中飘荡的记忆16 小时前
ElasticJob分布式调度从入门到实战
java·后端