编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • 性能优化实践

  • 程序编程原理

    • README
    • 序卷方法论

    • 数据的本质

    • 运行时模型

    • 并发的设计

      • README
        • 🎯 这一卷要回答什么
        • 📖 篇章总览(18 篇)
          • 🌱 起源篇(5 篇):理解线程为何而生
          • 🔥 矛盾篇(5 篇):理解并发 Bug 的根源与解法
          • 🚀 范式篇(4 篇):理解现代并发模型
          • 🏊 池化与结构化篇(4 篇):把前面所有原理用起来
        • 🔗 知识脉络
        • 🌉 与其他卷的承接
        • 💡 学完你能回答
        • ⚠️ 学习节奏建议
      • 1.线程前世今生探索
      • 2.并发上下文切换原理
      • 3.线程通信设计思想
      • 4.线程异常设计原理
      • 5.多线程并发经典案例
      • 6.并发Bug源头由来
      • 7.并发编程设计思想
      • 8.并发编程安全设计
      • 9.锁核心设计和思想
      • 10.理解CAS设计由来
      • 11.异步和同步的设计
      • 12.单线程模型的思想
      • 13.协程核心设计思想
      • 14.Actor与CSP并发模型
      • 15.线程池的设计思想
      • 16.线程池设计核心原理
      • 17.线程池使用技巧
      • 18.结构化并发设计思想
    • 内存的真相

    • 交互和系统

  • 稳定性与可靠性

  • 工程化与运维

  • 方案设计思想

  • 专栏
  • 程序编程原理
  • 并发的设计
杨充
2026-05-14
目录

README

# 第 3 卷|并发之道

专栏分量最重的一卷——18 篇文章,从硬件原子指令到结构化并发,把并发编程半个世纪的进化史完整走一遍。


# 🎯 这一卷要回答什么

并发是程序员永恒的痛点。你也许写过 synchronized、AtomicInteger、async/await、channel,但能回答下面这些"为什么"吗?

  • 线程到底是软件概念还是硬件概念? 没有 OS 之前世界上有没有"线程"?
  • 共享内存和消息传递——为什么 Erlang 选了一条路、Java 选了另一条?两条路真的不能合并吗?
  • 为什么并发 Bug 可以归纳成只有三种(可见性 / 原子性 / 有序性)?
  • CAS 解决了什么矛盾? 为什么硬件层面有了 LOCK#,软件层面还需要循环 CAS?
  • 协程是 1958 年发明的,为什么 2018 年才在 Kotlin / Swift / Java 21 集中爆发?
  • 结构化并发——为什么 Nathaniel Smith 说"goroutine 跟 goto 一样有害"?

这一卷不只是教你"用哪个 API",而是带你看见:每一个并发原语都是某个具体矛盾在某个历史时间点的最优解。


# 📖 篇章总览(18 篇)

# 🌱 起源篇(5 篇):理解线程为何而生

序号 文档 核心矛盾
3.1 线程前世今生探索 进程不够用?1:1 / N:1 / M:N 模型如何演进
3.2 并发上下文切换原理 进程 / 线程 / 协程切换代价的根本差异
3.3 线程通信设计思想 共享内存 vs 消息传递 —— 两条路线的硬件根因
3.4 线程异常设计原理 异常从硬件中断到语言层面经历了什么
3.5 多线程并发经典案例 售票问题:3 行代码引出 3 类 Bug

# 🔥 矛盾篇(5 篇):理解并发 Bug 的根源与解法

序号 文档 核心矛盾
3.6 并发 Bug 源头由来 可见性 / 原子性 / 有序性 —— 三种 Bug 的硬件根因
3.7 并发编程设计思想 分工 → 同步 → 互斥,并发的三大命题
3.8 并发编程安全设计 不可变 / TLS / 读写分离 / 无锁 —— 四种避坑策略
3.9 锁核心设计和思想 从 LOCK# 指令到 Java 锁升级的完整链路
3.10 理解 CAS 设计由来 从哲学到硬件,CAS 的 ABA 与解法

# 🚀 范式篇(4 篇):理解现代并发模型

序号 文档 核心矛盾
3.11 异步和同步的设计 同步 → 多线程 → 回调 → async/await 的演进
3.12 单线程模型的思想 单线程为何反而能高并发?
3.13 协程核心设计思想 "挂起 / 恢复" 的机器本质;有栈 vs 无栈
3.14 Actor 与 CSP 并发模型 Erlang 的 Actor vs Go channel 的 CSP

# 🏊 池化与结构化篇(4 篇):把前面所有原理用起来

序号 文档 核心矛盾
3.15 线程池的设计思想 池化思想的本质:生产者 - 消费者
3.16 线程池设计核心原理 ctl 变量、状态机、Worker 模型
3.17 线程池使用技巧 7 大参数调优实战
3.18 结构化并发设计思想 Kotlin / Swift / Java 21 / Trio 让并发"回归大括号"

# 🔗 知识脉络

flowchart TB
    A[3.1-3.5 起源篇<br/>线程为何被发明] --> B[3.6-3.10 矛盾篇<br/>并发 Bug 的根源与解法]
    B --> C[3.11-3.14 范式篇<br/>现代并发模型]
    C --> D[3.15-3.18 池化与结构化<br/>实战集大成]
    D --> F[读完此卷<br/>你能在脑中演进半世纪并发史]
    style F fill:#d4edda
1
2
3
4
5
6

# 🌉 与其他卷的承接

  • 承接第 2 卷:第 2 卷讲对象布局与调用栈,本卷的"锁升级"恰恰是 mark word 的几个 bit 在做状态机;协程"自己的栈"也是对栈帧的延伸。
  • 通往第 4 卷:内存模型(JMM / C++ MM)是并发原语正确性的基础,将在第 4 卷以"内存"视角重新审视。
  • 通往第 5 卷:第 5 卷"消息机制"本质就是单线程模型 + 事件循环 + 无锁队列。

# 💡 学完你能回答

  • 为什么 volatile 不能保证原子性,但能保证可见性?硬件上是怎么实现的?
  • synchronized 的偏向锁、轻量级锁、重量级锁,性能差距究竟有多少?什么场景该选哪个?
  • async/await 不就是回调的语法糖吗?JVM 字节码层面有什么不同?
  • 为什么 Go 不需要线程池?Goroutine 调度的 GMP 模型究竟解决了什么矛盾?
  • 线程池 corePoolSize、maximumPoolSize、queueCapacity 三者的"死亡组合"是什么?

# ⚠️ 学习节奏建议

这卷信息密度极高,强烈不建议三天打鱼。推荐:

第 1 周:3.1-3.5(起源篇)              循序渐进
第 2 周:3.6-3.10(矛盾篇)             硬核硬啃
第 3 周:3.11-3.14(现代范式)          深入新世界
第 4 周:3.15-3.18(池化 + 结构化)     落地总结
1
2
3
4

并发是个只能靠理解、不能靠记忆的领域。当你能在脑子里画出"一行代码触发的所有内存屏障 / cache 同步 / OS 调度"时,这一卷才算真正读完。

上次更新: 2026/06/07, 10:26:12
8.异常机制设计原理
1.线程前世今生探索

← 8.异常机制设计原理 1.线程前世今生探索→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式