0

0

Java多线程中常见并发容器有哪些_线程安全集合介绍

P粉602998670

P粉602998670

发布时间:2026-01-17 10:17:03

|

391人浏览过

|

来源于php中文网

原创

concurrenthashmap是高并发map首选,采用cas+synchronized锁单个节点,读无锁、写局部锁,键值不可为null,支持原子操作;copyonwritearraylist适用于读多写少且需遍历安全的场景;concurrentlinkedqueue是无锁高性能队列,适合非阻塞生产者-消费者模型;collections.synchronizedxxx和vector/hashtable因性能差、易误用而不推荐。

java多线程中常见并发容器有哪些_线程安全集合介绍

ConcurrentHashMap 是高并发 Map 的事实标准

绝大多数场景下,ConcurrentHashMap 应该是你替换 HashMap 的第一选择。它不是靠“整个 Map 加锁”来实现线程安全,JDK 8+ 后改用 CAS + synchronized 锁单个链表头或红黑树根节点,写操作冲突时才锁局部,读操作完全无锁

  • 键和值都不能为 null(这点和 HashMap 不同,避免歧义)
  • 迭代器是「弱一致性」:遍历时不会抛 ConcurrentModificationException,但可能看不到某些刚写入的元素,也可能看到已删除的残留 —— 这是设计取舍,不是 bug
  • 原子方法直接可用:putIfAbsent()computeIfAbsent()merge(),无需额外同步
  • 别用 containsKey() + get() 组合判断再取值 —— 这不是原子操作,中间可能被其他线程修改;应改用 computeIfAbsent()

CopyOnWriteArrayList 适合读多写少且需遍历安全的列表

当你需要在遍历过程中允许其他线程增删元素(比如事件监听器列表),又不想手动加锁,CopyOnWriteArrayList 就是为此而生。

  • 每次 add()remove()set() 都会复制整个底层数组,写开销大,不适合高频修改
  • 读操作极快且无锁,get()size() 都是 O(1)
  • 迭代器基于创建时的数组快照,遍历时哪怕其他线程已修改集合,也不会影响当前遍历结果,也不会抛异常
  • 不适用于实时性要求高的写后即读场景 —— 新增元素对正在遍历的线程不可见

ConcurrentLinkedQueue 是无锁高性能队列的首选

如果你在做生产者-消费者模型,且不需要阻塞语义(比如不希望线程挂起等待),ConcurrentLinkedQueueLinkedBlockingQueue 更轻量、更高效。

MemFree
MemFree

MemFree - 来自知识库和互联网的混合AI搜索,更快获取准确答案

下载
  • 基于 CAS 实现,完全无锁,吞吐量高,适合大量短任务投递
  • 非阻塞:offer()poll() 都立即返回,失败也不抛异常(返回 nullfalse
  • 不支持 iterator.remove(),遍历时调用 remove() 可能导致未定义行为
  • 注意:它不保证强一致性 —— 多线程同时 size() 可能返回近似值(因为内部计数也是 CAS 更新,非原子快照)

别碰 Collections.synchronizedXxx,除非你清楚代价

Collections.synchronizedList(new ArrayList()) 看起来简单,但实际是个“半吊子安全”方案,容易误用出错。

立即学习Java免费学习笔记(深入)”;

  • 单个方法如 add()get() 是线程安全的,但组合操作(比如先 contains()add())仍需手动同步
  • 最常踩的坑是遍历:for (x : list) 本质是隐式调用 iterator(),而这个迭代器本身**不加锁**,必须显式 synchronized(list) { ... } 包裹整段循环
  • 性能差:所有操作都锁整个对象,高并发下严重串行化,远不如 ConcurrentHashMapCopyOnWriteArrayList
  • Vector / Hashtable 已被官方标记为遗留类,明确不推荐新代码使用

真正难的不是选哪个类,而是识别「读多写少」「需遍历中修改」「要阻塞等待」这些隐含条件。同一个业务里,监听器列表用 CopyOnWriteArrayList,计数统计用 ConcurrentHashMap,任务分发用 ConcurrentLinkedQueue,才是常态 —— 别指望一个容器通吃所有场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

253

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

28

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号