10-除了 ConcurrentHashMap,这些并发容器和阻塞队列也该会
生产者消费者模型离不了阻塞队列读多写少场景CopyOnWrite比加锁香高频插入用无锁队列更猛。这一篇把 JUC 里常用的并发容器和阻塞队列全家桶补齐让你在合适场景直接掏出对的那个而不是无脑synchronized一把锁。一、为什么不能用普通集合做并发HashMap、ArrayList都不是线程安全的多线程下HashMap并发put可能死循环JDK 7 及之前头插法扩容、数据丢失、size 错乱。ArrayList并发add可能数组越界或元素覆盖。老办法是Collections.synchronizedMap/list给每个方法包synchronized但读写全互斥并发度低。JUC 的并发容器用更聪明的策略分段锁、CAS、写时复制读写可并行。二、ConcurrentHashMap并发 Map 的标准答案JDK 8 起用「数组 链表/红黑树 CAS synchronized锁桶头」实现读几乎无锁写只锁单个桶并发度极高。注意它的复合操作不是原子的// 错误putIfAbsent 是原子的但「判断放」两句不是if(!map.containsKey(k))map.put(k,v);// 多线程下可能重复放// 正确用原子复合方法map.putIfAbsent(k,v);map.computeIfAbsent(k,key-load(key));// 存在则不计算天然防重复computeIfAbsent还顺带解决了「双重检查 初始化」的竞态是缓存懒加载的利器。三、CopyOnWriteArrayList / CopyOnWriteArraySet读多写少专属原理写时复制。修改时复制一份底层数组在新数组上改改完把引用指向新数组读永远读旧数组读写互不阻塞。CopyOnWriteArrayListStringlistnewCopyOnWriteArrayList();list.add(a);// 复制数组追加开销大list.get(0);// 直接读无锁超快适用场景极明确读远多于写如监听器列表、配置白名单、路由表。缺点也明显每次写都复制整个数组写慢、占内存存在新旧两份瞬时副本。弱一致性读到的可能是修改前的快照不适合强实时。千万别用来做「频繁 add 的队列」那就变成内存杀手。四、ConcurrentLinkedQueue高并发无锁队列基于 Michael-Scott 算法的非阻塞无锁队列用 CAS 实现入队出队高并发下比阻塞队列吞吐更高因为没有锁竞争和线程挂起。ConcurrentLinkedQueueStringqnewConcurrentLinkedQueue();q.offer(task);// 入队CAS非阻塞Stringtq.poll();// 出队空返回 null适用高并发「提交即返回」、不需要「队列空就等」的场景如日志异步收集、事件总线。它不支持阻塞等待要阻塞请用下面的阻塞队列。五、阻塞队列 BlockingQueue 全家桶BlockingQueue是生产者-消费者模型的骨架队空时取操作阻塞队满时放操作阻塞。这是线程池workQueue、ArrayBlockingQueue背后的核心接口。实现底层有界特点ArrayBlockingQueue数组有界构造必填容量单锁公平可选最常用LinkedBlockingQueue链表可选不填无界Integer.MAX双锁入队出队分离吞吐高SynchronousQueue无缓冲0 容量提交必须有人立刻接否则等线程池缓存池用它PriorityBlockingQueue堆无界按优先级出队DelayQueue堆无界按延迟时间出队到期才能取LinkedTransferQueue链表无界融合SynchronousQueue队列transfer直交典型生产者消费者BlockingQueueTaskqnewArrayBlockingQueue(100);// 生产者newThread(()-{while(true)q.put(produce());}).start();// 满则阻塞// 消费者newThread(()-{while(true)consume(q.take());}).start();// 空则阻塞注意LinkedBlockingQueue不指定容量就是无界和线程池配一起有 OOM 风险第 7 篇提过务必指定容量。几个细分用法DelayQueue实现「延迟任务调度」如订单 30 分钟未支付自动关单——元素实现Delayedtake()等到过期时间才返回。SynchronousQueue容量 0生产者put必须等消费者take接手。适合「直接交接」场景Executors.newCachedThreadPool就是它。PriorityBlockingQueue按Comparable优先级出队无界注意内存。六、ConcurrentSkipListMap / Set并发且有序需要「并发 按 key 排序」用跳表实现的ConcurrentSkipListMap对应非并发的TreeMap。它支持range视图subMap适合并发环境下的范围查询/时间序列。七、选型速查场景用什么并发 KV 缓存/映射ConcurrentHashMap读极多写极少监听器/白名单CopyOnWriteArrayList/Set高并发提交、不需阻塞ConcurrentLinkedQueue生产者-消费者要阻塞ArrayBlockingQueue有界/LinkedBlockingQueue指定容量延迟任务/定时DelayQueue直接交接SynchronousQueue并发且有序ConcurrentSkipListMap/Set八、一个总原则并发容器不是「把HashMap换成ConcurrentHashMap就完事」。想清楚三件事是否真的共享且并发读写比如何复合操作要不要原子读多写少选CopyOnWrite要阻塞选阻塞队列纯高并发入队选无锁队列K-V 选 CHM。选错比不加锁还糟——比如把CopyOnWriteArrayList当高频写队列用直接内存爆炸。总结并发容器按场景选ConcurrentHashMap解决并发 KV注意复合操作要用putIfAbsent/computeIfAbsent才原子读多写少用CopyOnWrite写时复制读写不互斥弱一致高并发非阻塞入队用ConcurrentLinkedQueue生产者-消费者用BlockingQueueArrayBlockingQueue有界最安全、DelayQueue做延迟、SynchronousQueue零缓冲交接并发有序用ConcurrentSkipListMap。LinkedBlockingQueue务必指定容量防 OOM。

相关新闻

DeepSeek V4 Pro 深夜上线实测:跑分紧贴 Fable 5,TaoToken 统一 Key 接入配置全记录

DeepSeek V4 Pro 深夜上线实测:跑分紧贴 Fable 5,TaoToken 统一 Key 接入配置全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 17:20:37 阅读更多 →
Cursor不能用了?试试便宜量足的替代品 - Windsurf 配 TaoToken 统一 Key 通道

Cursor不能用了?试试便宜量足的替代品 - Windsurf 配 TaoToken 统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 17:20:37 阅读更多 →
openclaw 使用 ollama 切换模型:TaoToken 统一 Key 下的 gateway 配置与验证

openclaw 使用 ollama 切换模型:TaoToken 统一 Key 下的 gateway 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 17:20:37 阅读更多 →

最新新闻

Datawhale组队学习-深度学习笔记(一)

Datawhale组队学习-深度学习笔记(一)

文章目录第 1 章 神经网络简介第 2 章 PyTorch 入门总结第 1 章 神经网络简介 神经网络的学习,并不是灌输规则,也不是理解概念,而是通过反复调整参数,让函数逐步逼近我们期望的映射关系。 具体来说,神经网络的学习过程…

2026/9/25 18:04:04 阅读更多 →
轻量级校验库ValidX与Maven/Gradle的集成配置与排障实践

轻量级校验库ValidX与Maven/Gradle的集成配置与排障实践

1. 集成思路与方案选型1.1 ValidX是什么,为什么需要单独写集成指南先说清楚一件事:ValidX不是一个大而全的框架,它是一套专注于参数校验的轻量级工具库。很多团队在项目里已经用上了Spring的Validated或者Hibernate Validator,但遇…

2026/9/25 18:04:04 阅读更多 →
深入Linux USB协议栈:URB、枚举与驱动开发实战

深入Linux USB协议栈:URB、枚举与驱动开发实战

写Linux驱动的人,大概都绕不开USB。不管是做嵌入式、搞内核开发,还是日常接个U盘、鼠标、USB转串口调试单片机,背后都有一套成熟但不太容易看懂的机制在干活——这就是Linux内核里的USB协议栈框架。很多人能调通一个USB设备驱动,但…

2026/9/25 18:04:04 阅读更多 →
CLI-Anything 项目架构解析:用 TaoToken 统一 Key 打通 CLI Agent 配置链路

CLI-Anything 项目架构解析:用 TaoToken 统一 Key 打通 CLI Agent 配置链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 18:04:04 阅读更多 →
Substrate深度解析:从区块链框架到材料衬底的底层选型逻辑

Substrate深度解析:从区块链框架到材料衬底的底层选型逻辑

1. 从“substrate”这个词说起:它到底指什么第一次看到“substrate”这个标题,很多人会愣一下——这词太泛了。字面意思是“基底”“底层”“基质”,在生物学里指培养基,在材料学里指衬底,在区块链圈子里则特指那条著名…

2026/9/25 18:04:04 阅读更多 →
免费CRM总折腾?自建私有化CRM全流程实战——以DeskcommCRM为例

免费CRM总折腾?自建私有化CRM全流程实战——以DeskcommCRM为例

搞了这么多年软件,我见过太多团队在CRM选型上反复折腾:一开始图省事用免费CRM,业务跑起来后数据越来越多,权限一复杂就发现平台带不动;想自己写一套专门给销售和客服用的后台,又舍不得那个开发成本。后来我…

2026/9/25 18:03:03 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →