原来 Java 里线程安全集合有这么多种

原文来自于:zha-ge.cn/java/77

原来 Java 里线程安全集合有这么多种

有那么一天,咖啡喝多了,脑袋嗡嗡响,领导突然"温柔"地甩过来一坨需求:"你这List用的安全吗?多线程下会不会爆炸?" 我一口激浪差点喷屏幕,线程安全集合,这不是老生常谈嘛。可是等我翻代码,才发现自己其实只认识 Collections.synchronizedListVector,其他的都进垃圾回收站了。哎,这锅不能背,得扒一扒 Java 里的线程安全集合到底有几路豪杰。


初见江湖:这些名字我都见过?

Java 集合家族其实超级大,线程安全的那些,堪比武林门派,各有绝技。

  • Vector, Hashtable 这些上古遗迹,虽然老,但能保命。
  • Collections.synchronizedXXX 工厂方法,给老集合套个线程安全"特效皮肤"。
  • ConcurrentHashMap, CopyOnWriteArrayList 等并发大佬,JDK5后出道,秒杀前辈。

我还腾了个小表格,请叫我表哥:

集合名 线程安全性 优势 劣势
Vector 安全 祖传防爆,简单易懂 性能糟糕
Collections.synchronizedList 安全 易于转换,老代码福音 性能一般,颗粒粗
ConcurrentHashMap 超级安全 读多写少场景无敌,细粒度锁 写多可能瓶颈
CopyOnWriteArrayList 读安全 读写分离,读场景快 写操作开销大

砸场子的瞬间

我一开始跑路 Collections.synchronizedList,写了个多线程测试自信满满,结果直接春哥再临。问题出在哪?

java 复制代码
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
for (int i = 0; i < 1000; i++) {
    new Thread(() -> {
        syncList.add(Thread.currentThread().getName());
    }).start();
}
// 等等再遍历
for (String name : syncList) {
    System.out.println(name);
}

别问我为啥会ConcurrentModificationException,问就是for-each遍历没加锁。线程安全这个事儿,还得自己上心啊!上了锁,世界才安静:

java 复制代码
synchronized (syncList) {
    for (String name : syncList) {
        System.out.println(name);
    }
}

但这不优雅啊朋友,终于理解为啥 CopyOnWriteArrayList 会受宠。


踩坑瞬间

  • 以为加了 Collections.synchronizedList 就万事大吉,结果遍历都没锁上,直接爆炸。
  • Vector 还能用吗?能,但写多别碰它,性能跑不过 Concurrent 家族。
  • CopyOnWriteArrayList 很香,但写操作多会让你怀疑人生,因为每次写都要拷贝,内存都差点不够用了。
  • ConcurrentHashMap 的 Key/Value 不能随便为 null,不是所有 Map 都惯着你。

经验启示

  • 不是加了"线程安全"标签就能无脑用,遍历时记得手动加锁,尤其是同步包装类。
  • 读多写少就用 CopyOnWriteArrayList/Set/Map,写多还是 Concurrent 家族靠谱。
  • Vector、Hashtable 真的是爷青结,只适合和遗留系统"深情对望"。
  • 别的门派不懂的,别忘了 JavaDoc 黄金屋,多看看说明书,比我瞎踩坑省时多了。

最后,我现在面对线程安全集合都学会了一个骚操作:先问,啥场景?多读还是多写?要啥功能? 真不确定,用 Concurrent 系列,起码不会坑队友。 写代码就是这样嘛,边挨锤边成长,踩坑万岁!

相关推荐
如来神掌十八式几秒前
设计模式之装饰器模式
java·设计模式
cch89187 分钟前
C++、Python与汇编语言终极对比
java·开发语言·jvm
好家伙VCC18 分钟前
**InfluxDB实战进阶:基于Golang的高性能时序数据采集与可视化方
java·开发语言·后端·python·golang
斌味代码19 分钟前
Java SpringBoot 微服务实战:企业级架构设计与性能调优完全指南
java·spring boot·微服务
好家伙VCC20 分钟前
**发散创新:基于Go语言的服务网格实践与流量治理实战**在微服务架构日益复杂的今天,**服务网格(S
java·python·微服务·架构·golang
一定要AK8 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao8 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao9 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏4949 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
wuxinyan12310 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题