Java 中怎么在并发修改集合时选择正确的线程安全容器

大伟同学_7805

大伟同学_7805

2026-08-11

913人浏览

原创

选对线程安全容器关键看读写比例、是否需要阻塞、一致性要求和内存性能敏感度;读多写少用copyonwrite系列,读写均衡高频选concurrenthashmap,需阻塞用blockingqueue,单变量更新用原子类。

java 中怎么在并发修改集合时选择正确的线程安全容器

选对线程安全容器,关键不是看“能不能并发”,而是看“怎么并发”——读写比例、是否需要阻塞、一致性要求、内存与性能敏感度,这四点决定了哪个容器真正适合你。

先看读写特征:读多写少就用 CopyOnWrite 系列

如果集合主要用于遍历(比如监听器列表、配置白名单、规则缓存),而增删极少(每秒不超过几十次),CopyOnWriteArrayList 或 CopyOnWriteArraySet 是优选。

  • 读操作完全无锁,get() 和迭代都极快
  • 每次写操作(add/remove/set)复制整个数组,所以写开销大、GC 压力高
  • 迭代器基于创建时刻的快照,不会抛 ConcurrentModificationException,也不会看到新写入的元素
  • 不适合实时性要求高的场景,比如“刚加进去就要被另一个线程立刻查到”

读写均衡且高频,首选 ConcurrentHashMap

这是大多数业务场景的默认选择,尤其当多个线程频繁读取和更新键值对时(如用户会话缓存、计数统计、路由映射)。

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • JDK 8+ 使用 CAS + synchronized 锁单个桶(链表头或红黑树根),不是全表锁
  • 读操作无锁,写冲突只影响局部,吞吐量远高于 synchronizedMap
  • 键和值都不能为 null(避免歧义,这点和 HashMap 不同)
  • 别用 containsKey() + put() 这类组合操作——它不是原子的;改用 putIfAbsent()、computeIfAbsent() 或 merge()
  • size() 返回的是估算值,判断空请用 isEmpty()

需要阻塞等待或任务交接,上 BlockingQueue

典型用于生产者-消费者模型,比如异步日志、线程池任务队列、消息中转。

  • ArrayBlockingQueue:有界、基于数组、可重入锁,适合容量可控、强调稳定性的场景
  • LinkedBlockingQueue:默认无界(注意 OOM 风险)、读写分离双锁,吞吐通常更高
  • PriorityBlockingQueue:带优先级的无界队列,元素需实现 Comparable
  • SynchronousQueue:不存数据,每个 offer 必须配一个 poll,适合直接移交任务

只是单个变量更新,别绕弯子——用原子类

如果目标不是维护整个集合结构,而是计数器、开关标志、或替换整个引用,AtomicInteger、AtomicReference 等更轻量高效。

  • AtomicInteger.incrementAndGet() 是无锁原子操作,比 new ConcurrentHashMap 存单个计数器合理得多
  • AtomicReference> 可安全替换整个列表引用,但注意内部 List 本身仍需线程安全(比如用 CopyOnWriteArrayList)
  • 涉及多个字段协同更新(如余额+状态),原子类不够用,考虑 StampedLock 或显式 synchronized 块

不复杂但容易忽略:没有“万能线程安全集合”,只有“更适合当前访问模式”的集合。先理清你的读写频率、是否允许弱一致性、要不要阻塞、有没有内存限制,再对照特性匹配,比盲目套用 synchronized 包装或一律上 ConcurrentHashMap 更可靠。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9877

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7022

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6192

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1064

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1296

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2589

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19911

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1155

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习