当前位置: 首页 > news >正文

Collections.synchronizedList()详解

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


一、基本用法

List<Integer> list = new ArrayList<>();
List<Integer> syncList = Collections.synchronizedList(list);

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


二、源码解析(JDK 8)

来看 Collections 类的实现:

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

如果底层 list 是随机访问的(例如 ArrayList),则返回 SynchronizedRandomAccessList
否则返回 SynchronizedList。这两个类结构几乎一样,都是对原 List 加锁包装。


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

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() 为例:

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

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

List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());// 迭代时要手动加锁
synchronized (syncList) {for (Integer i : syncList) {System.out.println(i);}
}

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


✅ 六、小结

特性synchronizedListCopyOnWriteArrayList
加锁机制整体锁(synchronized)写时复制(volatile + CAS)
读性能慢(加锁)快(无锁)
写性能中(锁竞争)慢(复制数组)
一致性强一致最终一致(读快照)
使用场景写多读少读多写少
http://www.dtcms.com/a/483042.html

相关文章:

  • 做一家仓储用地的网站陕西十二建设有限公司网站
  • 网站有备案号吗天元建设集团有限公司发展历程
  • 网站建设的税收分类编码淘宝店需要多少资金
  • 做网站创业怎么样wordpress 透明背景
  • win10秘钥登录linux问题
  • 丹东建设网官方网站移动云服务器
  • OkHttp源码解析(二)
  • 【高中小蓝本】数论 02 最大公约数 最小公倍数
  • 【LeetCode】72. 编辑距离
  • 17网站一起做网店的流程北京竞价托管代运营
  • DM线程的管理知识学习
  • System V IPC:Linux进程通信的标准方案
  • 免费的舆情网站app下载ui设计手机界面
  • Spring 三级缓存
  • 怎么样看网站用什么程序做的开发公司经营范围
  • 小广告网站音乐网站系统怎么做
  • 单片机中的TVS管
  • c++最常用的几种设计模式
  • 河南平台网站建设公司临沂企业自助建站系统
  • 下载 asp 网站源码响应式网站 翻译代码
  • 大气医院网站源码河北省住房和城乡建设厅信用网站
  • 【agent】AI 数字人构建10:FunASR 1:语音识别C++服务/客户端构建
  • 教育机构网站建设方案书企业邮箱注册需要多少钱
  • 河南省建设工程监理协会网站cms 导航网站
  • Centos Stream 8 Tomcat学习
  • 网站系统cmsphp教育网站开发工作
  • 在Ubuntu22.04和24.04中安装Docker并安装和配置Java、Mysql、Tomcat
  • 【Linux】线程同步与互斥(1)
  • 网站开发英语英语义乌网八方资源家1688网商网
  • 基于单片机的PID调节脉动真空灭菌器上位机远程监控设计