第5章 并发编程事故现场


文档摘要

第5章 · 并发编程事故现场 章节摘要:并发 Bug 的共同特征是"测试环境永远复现不了"。本章四个现场:可见性失灵让一个停止标志永远读不到 true;两把锁的获取顺序相反造成死锁;线程池队列无界堆积把堆撑爆;CompletableFuture 把异常吞进了一个没人看的角落。每一节都配现场、机理与修复。 学习目标 用 Java 内存模型(JMM)解释可见性与有序性问题,说清 volatile 的能力边界 画出死锁的四要素与锁顺序图,掌握 jstack 的死锁检测 按任务类型推算线程池核心参数,理解无界队列与拒绝策略的风险 预判 CompletableFuture 的异常传播路径与超时语义 核心概念速览 并发正确性不是"跑一万次没出错",而是"在 JMM 的允许范围内都不出错"。

第5章 · 并发编程事故现场

章节摘要:并发 Bug 的共同特征是"测试环境永远复现不了"。本章四个现场:可见性失灵让一个停止标志永远读不到 true;两把锁的获取顺序相反造成死锁;线程池队列无界堆积把堆撑爆;CompletableFuture 把异常吞进了一个没人看的角落。每一节都配现场、机理与修复。

学习目标

  1. 用 Java 内存模型(JMM)解释可见性与有序性问题,说清 volatile 的能力边界
  2. 画出死锁的四要素与锁顺序图,掌握 jstack 的死锁检测
  3. 按任务类型推算线程池核心参数,理解无界队列与拒绝策略的风险
  4. 预判 CompletableFuture 的异常传播路径与超时语义

核心概念速览

并发正确性不是"跑一万次没出错",而是"在 JMM 的允许范围内都不出错"。

子章节导航

5.1 可见性与 volatile 失灵复盘

后台线程不退出的怪事:标志位明明置了 true,另一线程就是读不到。

5.2 死锁与锁升级事故

一次发布后的全站线程 hang,两把锁各被持有一半,互相等对方放手。

5.3 线程池打满与参数复盘

接口 RT 正常、队列长度却破了百万——无界队列把失败从"快速拒绝"推迟成"全体超时"。

5.4 CompletableFuture 异常吞没

异步编排上线后监控一片绿,业务却悄悄丢了三分之一的写入。

子章节之间的逻辑关系

四节沿"共享什么"递进:共享一个标志位(可见性)→ 共享两把锁(死锁)→ 共享一个池(容量)→ 共享一条异步链(异常传播)

事故 破坏的性 检测手段 修复模式 ------ ---------- ---------------- -------------------- 标志失灵 可见性 jstack 看 WAITING volatile 或锁 互相等待 有序加锁 jstack 死锁自动检测 统一锁序 tryLock 队列堆积 容量边界 池与队列监控 有界队列+拒绝策略 异常丢失 传播路径 异常采样的监控 exceptionally 统一收口

前置知识与后续延伸

  • 前置:第 2 章不可变思想、第 4 章线程安全工具类事故。
  • 为后续铺垫:第 6 章 JVM 的线程栈与 GC 分析大量用到本章的 jstack 输出;第 8 章压测与容量规划以本章的池参数为基础。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U