并发编程
从并发问题的基本边界出发,逐步理解硬件内存模型、语言并发语义,以及常见并发工具背后的工作原理。
- 并发编程(零):并发问题与讨论范围
限定单机、单进程范围,从共享变量出发,建立共享内存、消息传递、语言并发语义与硬件实现之间的整体关系。
- 并发编程(一):先谈硬件——从 count++ 到原子性、可见性与有序性
从冯·诺依曼体系结构和指令执行过程出发,沿着 count++ 分析硬件层面的原子性、可见性与有序性问题。
- 并发编程(1.5):操作系统层——Thread、Scheduler 与 Runtime 调度
沿着 Java Platform/Virtual Thread、Go G-M-P 与 CPython threading.Thread 的真实调度路径,理解 Runtime 如何把执行单元交给 OS Thread,并最终由 Operating System Scheduler 调度到 CPU。
- 并发编程(二):语言内存模型——程序员可以依赖的规则
从硬件内存模型回到语言层,理解语言为什么需要定义内存模型,以及 Java、Go 与 CPython 分别为并发程序提供哪些基本保证。
- 并发编程(三):互斥锁——语言层的原子性、可见性与有序性
继续使用 counter++,理解互斥锁如何提供原子性、可见性和有序性,并比较 Java synchronized、Go sync.Mutex 与 CPython threading.Lock 的语义差异。
- 并发编程(四):互斥锁的实现——从 Runtime 到 CPU
沿着 Java synchronized、Go sync.Mutex 和 CPython threading.Lock 的真实实现路径,理解互斥锁如何使用原子操作、内存顺序以及等待与唤醒。
- 并发编程(五):Atomic——语言层的原子性、可见性与有序性
继续使用 counter 与 ready,从语言内存模型和公开 API 规则理解 Java AtomicInteger、Go sync/atomic 与 CPython 的 Atomic 语义边界。
- 并发编程(六):Atomic 的实现——从 Runtime 到 CPU
沿着 Java AtomicInteger、Go sync/atomic 和 CPython 内部 Atomic 的真实实现路径,理解 Atomic RMW、CAS、内存顺序以及它与 Mutex 的区别。
- 并发编程(七):volatile——从语言规则到 CPU
沿用 counter + ready 的例子,从 Java 内存模型一路看到 HotSpot 与 x86-64,理解 volatile 如何提供可见性和有序性,以及它与 Atomic、Mutex 的边界。
- 并发编程(八):读写锁——从语言规则到 CPU
沿用 counter 与 counter + ready 的例子,从 Java 读写锁规则一路看到 JDK、HotSpot 与 x86-64,理解 ReadWriteLock 如何提供原子性、可见性与有序性,以及它与 Mutex 的边界。