新闻详情

新闻详情

首页 / 资讯中心 / 详情

10-除了 ConcurrentHashMap,这些并发容器和阻塞队列也该会

发布时间:2026/9/25 17:19:42来源:尧图网络
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。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

如何参与这个开源项目?My-Brain-Is-Full-Crew贡献指南与社区生态 2026/9/25 17:50:51

如何参与这个开源项目?My-Brain-Is-Full-Crew贡献指南与社区生态

如何参与这个开源项目?My-Brain-Is-Full-Crew贡献指南与社区生态 【免费下载链接】My-Brain-Is-Full-Crew Built by a PhD whose memory was failing, whose diet was a mess, and whose anxiety had its own agenda. Most second brain tools ignore the fact that…

阅读更多 →
MaaEnd常见问题排查指南:日志导出、调试图像与Issue反馈的完整流程 2026/9/25 17:50:39

MaaEnd常见问题排查指南:日志导出、调试图像与Issue反馈的完整流程

MaaEnd常见问题排查指南:日志导出、调试图像与Issue反馈的完整流程 【免费下载链接】MaaEnd MaaEnd 终末地小助手:基于视觉 AI 的「明日方舟:终末地」自动化工具 项目地址: https://gitcode.com/gh_mirrors/maa/MaaEnd MaaEnd 是基于视…

阅读更多 →
MicYou均衡器与实时监测面板:10段EQ精调人声,延迟丢包一目了然 2026/9/25 17:50:33

MicYou均衡器与实时监测面板:10段EQ精调人声,延迟丢包一目了然

MicYou均衡器与实时监测面板:10段EQ精调人声,延迟丢包一目了然 【免费下载链接】MicYou MicYou is a powerful tool that turns your Android device into a high-quality microphone for your PC. 项目地址: https://gitcode.com/gh_mirrors/mi/MicYou MicYou 均衡器&a…

阅读更多 →
基于SpringBoot+Vue的医院挂号预约系统的设计与实现 2026/9/25 17:50:20

基于SpringBoot+Vue的医院挂号预约系统的设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 项目背景与意义 随着医疗信息化建设的不断推进,传统的人工挂号方式暴露出排队时间长、号源分配不透明、就诊流程繁琐等问题。患者往往需要提前到医院现场…

阅读更多 →
2^N深度卷积器RTL可拓展设计:参数化架构与APB接口实战 2026/9/25 17:49:48

2^N深度卷积器RTL可拓展设计:参数化架构与APB接口实战

1. 从标题拆解出的真实需求“2^N深度卷积器”这个说法,第一次看到的人可能会愣一下:卷积器不是做图像卷积的吗,怎么还带深度参数?其实在RTL设计语境里,这里的“深度”指的是卷积运算的抽头数量(tap count&a…

阅读更多 →
基于大数据架构的空气质量智能分析系统设计与实现 2026/9/25 17:49:29

基于大数据架构的空气质量智能分析系统设计与实现

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 1. 项目背景与意义 随着工业化与城市化进程的持续推进,大气污染问题日益受到社会各界的广泛关注。PM2.5、PM10、二氧化硫、二氧化氮、臭氧等污染物浓度直接…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉