posts

《Java 并发编程·线程与内存模型》 · 全书目录与章节索引(50 篇)

《Java 并发编程·线程与内存模型》全 50 篇,从进程与线程模型讲到 JMM、volatile 与 synchronized、等待通知、中断、ThreadLocal 与 ScopedValue、CAS 与原子类、锁选型、线程池、定时任务、ForkJoin、CompletableFuture、虚拟线程与结构化并发,配 JCStress 与本机实测输出:15 章 45 节加前置与附录的完整索引。

《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.11.1 从进程到线程:JVM 线程模型1:1 内核映射、平台线程成本、栈大小、threadId
1.21.2 Thread、Runnable、Callable 与任务抽象任务与执行分离、Future、ThreadFactory、异常去哪了
1.31.3 生命周期、优先级与守护线程六种状态与迁移、优先级不可靠、daemon 不阻止退出
2.12.1 竞态的三种形态check-then-act、read-modify-write、发布逸出、UnsafeLoanService
2.22.2 线程安全的四类策略不可变、互斥、线程封闭、并发容器,以及怎么选
2.32.3 用 JCStress 复现计数器竞态注解写法、ACCEPTABLE/FORBIDDEN、FREQ 不是概率
3.13.1 重排序、可见性与有序性编译器与 CPU 重排、as-if-serial、停不下来的循环
3.23.2 happens-before 八条规则程序顺序、监视器、volatile、start/join、传递性
3.33.3 final 字段与安全发布final 语义、构造逸出、四类安全发布

第二部分:同步原语与协作(第 4–6 章)

节文章核心内容
4.14.1 volatile 的语义与边界可见性、禁止重排、屏障位置、不保证复合原子性
4.24.2 synchronized 的字节码与对象头monitorenter/monitorexit、Mark Word、可重入计数
4.34.3 锁消除、锁粗化与偏向锁的移除逃逸分析、锁消除与粗化、JDK 25 移除偏向锁的事实
5.15.1 wait/notify 的正确姿势必须持有监视器、wait 释放锁、notify 不释放锁
5.25.2 虚假唤醒与条件谓词循环为什么必须用 while、条件谓词、丢失唤醒
5.35.3 手写有界缓冲区完整 BoundedBuffer<T>、双条件、关闭语义
6.16.1 interrupt 的真实语义标志位、异常清除标志、不可中断阻塞、恢复中断
6.26.2 两阶段终止与协作式取消volatile running + interrupt + join、取消边界
6.36.3 shutdown hook 与释放顺序addShutdownHook、顺序不确定、超时、异常被吞

第三部分:线程封闭、无锁与锁选型(第 7–9 章)

节文章核心内容
7.17.1 ThreadLocal 的实现与内存泄漏ThreadLocalMap、弱引用 key、value 强引用、remove
7.27.2 InheritableThreadLocal 与线程池断裂父子复制时机、池复用串值、显式传参
7.37.3 ScopedValue:JDK 25 的作用域值已转正、where/call/run、不可变绑定、与 ThreadLocal 对比
8.18.1 CAS 原理与 ABACAS 指令、失败重试、ABA、AtomicStampedReference
8.28.2 原子类家族与字段更新器基本/引用/数组/字段更新器、compareAndSet 语义
8.38.3 LongAdder 与高竞争累加Cell 分片、伪共享、sum 非快照、什么时候不用
9.19.1 自旋、阻塞与 park/unpark自旋代价、LockSupport、许可语义、自适应自旋
9.29.2 ReentrantLock 与 synchronized 的取舍可中断、超时、公平、条件队列、何时坚持 synchronized
9.39.3 读写锁与 StampedLock读写分离、写饥饿、乐观读与版本戳、不可重入

第四部分:线程池、调度与异步编排(第 10–13 章)

节文章核心内容
10.110.1 线程池七参数与执行流程core/max/queue/keepAlive/工厂/拒绝、提交顺序
10.210.2 队列与拒绝策略四种拒绝策略、CallerRunsPolicy 反压、有界队列
10.310.3 监控、动态调参与关闭活跃数与队列长度、setCorePoolSize、shutdown 两段式
11.111.1 Timer 的缺陷与 ScheduledThreadPoolExecutor单线程、异常终止、时钟敏感;STPE 的三处不同
11.211.2 延迟队列与时间轮DelayQueue/Delayed、时间轮原理与复杂度
11.311.3 调度漂移、幂等与补偿fixedRate vs fixedDelay、漂移、错过补偿、幂等键
12.112.1 工作窃取与 ForkJoinPool双向队列、窃取方向、并行度、commonPool 默认值来源
12.212.2 并行流的边界与 commonPool 陷阱拆分成本、阻塞任务污染、顺序依赖、parallel() 代价
12.312.3 分治拆分、阈值与异常阈值选择、异常传播、取消、任务粒度
13.113.1 CompletableFuture 的创建与组合supplyAsync/thenCompose/allOf/anyOf、默认执行器
13.213.2 异常、超时与取消exceptionally/handle/whenComplete、orTimeout、取消不中断
13.313.3 上下文传递与线程池隔离默认 commonPool、ThreadLocal 丢失、装饰器传递、池隔离

第五部分:虚拟线程与结构化并发(第 14–15 章)

节文章核心内容
14.114.1 虚拟线程的调度模型载体线程、mount/unmount、栈片段、吞吐来源
14.214.2 pinning:JDK 25 还剩什么JEP 491 后 synchronized 不再 pin、native 与类初始化边界、JFR 事件
14.314.3 虚拟线程下的池、ThreadLocal 与限流连接池仍是瓶颈、Semaphore 限流、ThreadLocal 数量、MDC
15.115.1 StructuredTaskScope 的作用域preview 标注、open/fork/join/close、子任务生命周期
15.215.2 Joiner、失败传播与取消awaitAll、allSuccessfulOrThrow、anySuccessfulResultOrThrow
15.315.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 都建议先读。后面所有「为什么这样写才对」的判断,最终都会回到那八条规则。

相关专题

全部文章 game Indie Java golang Books 客户端开发 Minigame Saas rust Python
books

《Java 并发编程·线程与内存模型》7.2 InheritableThreadLocal 与线程池断裂

InheritableThreadLocal 只在线程创建时复制一次快照,这个前提在线程池里不成立。实测同一个池线程连续服务三个请求,读到的都是第一个请求的会员号;父线程在创建后改值,子线程仍看到旧值。拆解串值、丢失、残留、半更新四种失败形态,给出方法参数、提交侧捕获、Executor 装饰器三种显式透传写法。

7 分钟阅读
书稿 Java 并发编程
books

《Java 并发编程·线程与内存模型》6.1 interrupt 的真实语义

interrupt 不是杀死线程,只是把一个标志位置为 true,真正的退出仍要靠被中断线程自己检查。本文用 sleep、wait、join、synchronized 竞争与 ReentrantLock 在本机实测中断行为,说明 InterruptedException 为什么会清除标志、哪些阻塞根本不响应中断,并给出捕获后恢复标志再包装成 LoanException 的写法与边界。

9 分钟阅读
书稿 Java 并发编程