《Java 并发编程·线程与内存模型》全 50 篇,是「Java 并发编程」三卷本的第一卷。它不读 JUC 源码、不讲线上事故,只回答一个问题:每条并发规则在什么条件下成立。实验数据来自本机 Temurin 25.0.5+8,工具用 JCStress、JMH 与 JFR。
本页是《Java 并发编程·线程与内存模型》的全书目录:按章节顺序列出全部 50 篇,点击标题直达正文。也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇 里的三条学习路径。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《Java 并发编程·线程与内存模型》 |
| 篇数 | 50 篇(15 章 45 节 + 序、前言、目录 + 附录 A/B) |
| 领域 | 线程模型、Java 内存模型、同步原语、无锁结构、线程池、虚拟线程 |
| 贯穿项目 | libraryd-conc —— 一个逐步改造成正确、可测、可扩展的图书借阅服务 |
| 上游项目 | libraryd —— 《Java 编程实战》里的借阅服务,本卷只改造其中的并发路径 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按症状跳读 |
| 主线版本 | JDK 25 LTS(Temurin 25.0.5+8)、Maven 3.9.12 |
| 关键依赖 | JCStress 0.16、JMH 1.37、JUnit Jupiter 5.14.4 |
| 上级专题 | 书稿专题 |
三卷分工:
| 卷 | 书名 | 关注点 |
|---|---|---|
| 卷一 | 《Java 并发编程·线程与内存模型》 | 会写正确的并发代码 |
| 卷二 | 《Java 并发编程·JUC 源码与容器》 | 知道 JUC 为什么这样实现 |
| 卷三 | 《Java 并发编程·性能诊断与事故》 | 能压、能查、能救火 |
全书目录
前置
| 节 | 文章 | 核心内容 |
|---|---|---|
| — | 序:从会开线程到知道为什么 | 并发能力三层、三卷分工、本书不承诺什么 |
| — | 前言:环境、项目与读法 | JDK 25、Maven、三模块结构、preview 状态对照 |
| — | 目录与学习路径 | 三条路径、十五章依赖、与其它两卷的衔接 |
第一部分:线程、竞态与内存模型(第 1–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 1.1 从进程到线程:JVM 线程模型 | 1:1 内核映射、平台线程成本、栈大小、threadId |
| 1.2 | 1.2 Thread、Runnable、Callable 与任务抽象 | 任务与执行分离、Future、ThreadFactory、异常去哪了 |
| 1.3 | 1.3 生命周期、优先级与守护线程 | 六种状态与迁移、优先级不可靠、daemon 不阻止退出 |
| 2.1 | 2.1 竞态的三种形态 | check-then-act、read-modify-write、发布逸出、UnsafeLoanService |
| 2.2 | 2.2 线程安全的四类策略 | 不可变、互斥、线程封闭、并发容器,以及怎么选 |
| 2.3 | 2.3 用 JCStress 复现计数器竞态 | 注解写法、ACCEPTABLE/FORBIDDEN、FREQ 不是概率 |
| 3.1 | 3.1 重排序、可见性与有序性 | 编译器与 CPU 重排、as-if-serial、停不下来的循环 |
| 3.2 | 3.2 happens-before 八条规则 | 程序顺序、监视器、volatile、start/join、传递性 |
| 3.3 | 3.3 final 字段与安全发布 | final 语义、构造逸出、四类安全发布 |
第二部分:同步原语与协作(第 4–6 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | 4.1 volatile 的语义与边界 | 可见性、禁止重排、屏障位置、不保证复合原子性 |
| 4.2 | 4.2 synchronized 的字节码与对象头 | monitorenter/monitorexit、Mark Word、可重入计数 |
| 4.3 | 4.3 锁消除、锁粗化与偏向锁的移除 | 逃逸分析、锁消除与粗化、JDK 25 移除偏向锁的事实 |
| 5.1 | 5.1 wait/notify 的正确姿势 | 必须持有监视器、wait 释放锁、notify 不释放锁 |
| 5.2 | 5.2 虚假唤醒与条件谓词循环 | 为什么必须用 while、条件谓词、丢失唤醒 |
| 5.3 | 5.3 手写有界缓冲区 | 完整 BoundedBuffer<T>、双条件、关闭语义 |
| 6.1 | 6.1 interrupt 的真实语义 | 标志位、异常清除标志、不可中断阻塞、恢复中断 |
| 6.2 | 6.2 两阶段终止与协作式取消 | volatile running + interrupt + join、取消边界 |
| 6.3 | 6.3 shutdown hook 与释放顺序 | addShutdownHook、顺序不确定、超时、异常被吞 |
第三部分:线程封闭、无锁与锁选型(第 7–9 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 7.1 | 7.1 ThreadLocal 的实现与内存泄漏 | ThreadLocalMap、弱引用 key、value 强引用、remove |
| 7.2 | 7.2 InheritableThreadLocal 与线程池断裂 | 父子复制时机、池复用串值、显式传参 |
| 7.3 | 7.3 ScopedValue:JDK 25 的作用域值 | 已转正、where/call/run、不可变绑定、与 ThreadLocal 对比 |
| 8.1 | 8.1 CAS 原理与 ABA | CAS 指令、失败重试、ABA、AtomicStampedReference |
| 8.2 | 8.2 原子类家族与字段更新器 | 基本/引用/数组/字段更新器、compareAndSet 语义 |
| 8.3 | 8.3 LongAdder 与高竞争累加 | Cell 分片、伪共享、sum 非快照、什么时候不用 |
| 9.1 | 9.1 自旋、阻塞与 park/unpark | 自旋代价、LockSupport、许可语义、自适应自旋 |
| 9.2 | 9.2 ReentrantLock 与 synchronized 的取舍 | 可中断、超时、公平、条件队列、何时坚持 synchronized |
| 9.3 | 9.3 读写锁与 StampedLock | 读写分离、写饥饿、乐观读与版本戳、不可重入 |
第四部分:线程池、调度与异步编排(第 10–13 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 10.1 | 10.1 线程池七参数与执行流程 | core/max/queue/keepAlive/工厂/拒绝、提交顺序 |
| 10.2 | 10.2 队列与拒绝策略 | 四种拒绝策略、CallerRunsPolicy 反压、有界队列 |
| 10.3 | 10.3 监控、动态调参与关闭 | 活跃数与队列长度、setCorePoolSize、shutdown 两段式 |
| 11.1 | 11.1 Timer 的缺陷与 ScheduledThreadPoolExecutor | 单线程、异常终止、时钟敏感;STPE 的三处不同 |
| 11.2 | 11.2 延迟队列与时间轮 | DelayQueue/Delayed、时间轮原理与复杂度 |
| 11.3 | 11.3 调度漂移、幂等与补偿 | fixedRate vs fixedDelay、漂移、错过补偿、幂等键 |
| 12.1 | 12.1 工作窃取与 ForkJoinPool | 双向队列、窃取方向、并行度、commonPool 默认值来源 |
| 12.2 | 12.2 并行流的边界与 commonPool 陷阱 | 拆分成本、阻塞任务污染、顺序依赖、parallel() 代价 |
| 12.3 | 12.3 分治拆分、阈值与异常 | 阈值选择、异常传播、取消、任务粒度 |
| 13.1 | 13.1 CompletableFuture 的创建与组合 | supplyAsync/thenCompose/allOf/anyOf、默认执行器 |
| 13.2 | 13.2 异常、超时与取消 | exceptionally/handle/whenComplete、orTimeout、取消不中断 |
| 13.3 | 13.3 上下文传递与线程池隔离 | 默认 commonPool、ThreadLocal 丢失、装饰器传递、池隔离 |
第五部分:虚拟线程与结构化并发(第 14–15 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 14.1 | 14.1 虚拟线程的调度模型 | 载体线程、mount/unmount、栈片段、吞吐来源 |
| 14.2 | 14.2 pinning:JDK 25 还剩什么 | JEP 491 后 synchronized 不再 pin、native 与类初始化边界、JFR 事件 |
| 14.3 | 14.3 虚拟线程下的池、ThreadLocal 与限流 | 连接池仍是瓶颈、Semaphore 限流、ThreadLocal 数量、MDC |
| 15.1 | 15.1 StructuredTaskScope 的作用域 | preview 标注、open/fork/join/close、子任务生命周期 |
| 15.2 | 15.2 Joiner、失败传播与取消 | awaitAll、allSuccessfulOrThrow、anySuccessfulResultOrThrow |
| 15.3 | 15.3 从 ExecutorService 迁移的边界 | 不可跨作用域、异常包装、与虚拟线程关系、preview 风险 |
附录
| 节 | 文章 | 核心内容 |
|---|---|---|
| A | 附录 A 并发 API 速查 | 线程/执行器/同步器/原子类/虚拟线程的常用方法表 |
| B | 附录 B 并发诊断命令与 JFR 事件 | jcmd、jstack、JFR 事件、jfr print 过滤与真实输出 |
怎么读
三条路径,按你现在的处境选:
| 路径 | 适合谁 | 从哪进 | 重点章节 |
|---|---|---|---|
| 顺序读 | 想系统补并发基础 | 序 | 全部 15 章 |
| 排障读 | 线上有可见性/死锁/丢更新问题 | 2.1 竞态的三种形态 | 第 2、3、5、6 章 + 附录 B |
| 选型读 | 要决定用哪种锁、哪个池 | 2.2 线程安全的四类策略 | 第 4、8、9、10、14 章 |
无论走哪条路径,第 3 章的 happens-before 都建议先读。后面所有「为什么这样写才对」的判断,最终都会回到那八条规则。
相关专题
- 《Java 并发编程·JUC 源码与容器》:AQS、
ConcurrentHashMap、Striped64、CompletableFuture的实现。 - 《Java 并发编程·性能诊断与事故》:压测、指标、事故复盘与线上定位。
- 《Java 高级编程》 :第 4–6 章给的是结论,本卷给的是实现、实验与取舍。
- 《Java 网络编程基础》 :网络线程模型与 Reactor 的对照。