0

0

在Java里如何使用并发集合_Java并发编程中的集合类应用解析

P粉602998670

P粉602998670

发布时间:2026-02-10 08:44:02

|

700人浏览过

|

来源于php中文网

原创

ConcurrentHashMap 不可用 HashMap 替代,因其在多线程下 put/get/扩容会引发死循环(JDK7)或数据丢失(JDK8+),而 ConcurrentHashMap 通过分段锁(JDK7)或 CAS+synchronized(JDK8)保证线程安全,读操作几乎无锁。

在java里如何使用并发集合_java并发编程中的集合类应用解析

ConcurrentHashMap 为什么不能直接用 HashMap 替代

因为 HashMap 在多线程环境下 put、get 或扩容时可能引发死循环(JDK 7)或数据丢失(JDK 8+),而 ConcurrentHashMap 通过分段锁(JDK 7)或 CAS + synchronized(JDK 8)保证线程安全,且读操作几乎无锁。

常见错误现象:ConcurrentModificationException 在遍历时仍可能出现——不是因为并发修改检测失效,而是你用了 iterator() 后在另一个线程调用 remove()clear(),而迭代器不感知这些变更。

  • 遍历推荐用 forEach()keySet().forEach()entrySet().parallelStream(),避免显式 Iterator
  • 不要在遍历中调用 put() / remove() —— 即使是 ConcurrentHashMap,也不支持“边遍历边结构性修改”
  • JDK 8+ 中 computeIfAbsent() 是原子的,比先 get()put() 更安全

CopyOnWriteArrayList 适合什么场景,又为什么慢

CopyOnWriteArrayList 每次写操作(add、set、remove)都会复制整个底层数组,读操作完全无锁。它只适合「读多写极少」且写操作不敏感延迟的场景,比如监听器列表、配置白名单缓存。

性能影响明显:10 万元素 add 一次可能触发数 MB 数组复制;频繁写会导致 GC 压力陡增。

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

  • 别把它当普通 ArrayList 用在循环内反复 add —— 这是典型误用
  • 它的 iterator() 返回的是快照,后续写操作对当前迭代器不可见,这点和 ConcurrentHashMap 的弱一致性不同,是强快照语义
  • 没有 contains() 的高效实现,内部是线性扫描,大数据量下慎用

BlockingQueue 实现线程间解耦的关键参数怎么选

ArrayBlockingQueueLinkedBlockingQueue 最常用,但容量策略差异极大:

炉米Lumi
炉米Lumi

字节跳动推出的AI模型分享社区和模型训练平台

下载
  • ArrayBlockingQueue 是有界队列,构造时必须指定容量,内部用单个 ReentrantLock 控制入队/出队,吞吐略低但内存可控
  • LinkedBlockingQueue 默认构造是无界(Integer.MAX_VALUE),看似安全,实则容易掩盖生产者过快问题,导致 OOM
  • 若用 new LinkedBlockingQueue(1024) 显式设界,它会为入队和出队分别使用独立锁(takeLock / putLock),吞吐更高

错误现象:用无界队列做日志缓冲,突发流量把堆打满;或用 SynchronousQueue(实际无缓冲)却没配够消费者线程,导致生产者阻塞超时。

为什么 Collections.synchronizedList 不如 CopyOnWriteArrayList 或 BlockingQueue

Collections.synchronizedList(new ArrayList()) 只是对每个方法加了 synchronized(this),锁粒度太粗:一次遍历要持锁全程,所有线程串行排队,本质是“伪并发”。而 CopyOnWriteArrayList 读不加锁,BlockingQueue 分离生产和消费路径。

更隐蔽的问题是:即使加了 synchronized,遍历仍需手动同步 —— 否则仍可能抛 ConcurrentModificationException 或读到不一致状态。

  • 正确遍历方式:
     synchronized (list) { list.iterator().forEachRemaining(...); }
  • 它不提供任何等待/通知机制,无法实现“生产者等空位、消费者等数据”的协作逻辑
  • 在高竞争场景下,锁争用远高于 ConcurrentHashMapStampedLock 等现代同步工具

真正需要线程安全集合时,优先按场景选专用类,而不是套一层 synchronized 包装器——后者只是最省事的错觉。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

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

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

161

2025.12.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

406

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

585

2023.08.10

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

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

633

2023.08.10

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

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

283

2025.12.24

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

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

22

2026.01.21

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

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

23

2026.01.21

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

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

53

2026.02.06

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

132

2026.02.06

热门下载

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

精品课程

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

共23课时 | 3.4万人学习

C# 教程
C# 教程

共94课时 | 9万人学习

Java 教程
Java 教程

共578课时 | 62.4万人学习

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

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