1. 并发编程(一):先谈硬件——从 count++ 到原子性、可见性与有序性

    从冯·诺依曼体系结构和指令执行过程出发,沿着 count++ 分析硬件层面的原子性、可见性与有序性问题。

  2. 并发编程(二):语言内存模型——程序员可以依赖的规则

    从硬件内存模型回到语言层,理解语言为什么需要定义内存模型,以及 Java、Go 与 CPython 分别为并发程序提供哪些基本保证。

  3. 并发编程(零):并发问题与讨论范围

    限定单机、单进程范围,从共享变量出发,建立共享内存、消息传递、语言并发语义与硬件实现之间的整体关系。

  4. 并发编程(八):读写锁——从语言规则到 CPU

    沿用 counter 与 counter + ready 的例子,从 Java 读写锁规则一路看到 JDK、HotSpot 与 x86-64,理解 ReadWriteLock 如何提供原子性、可见性与有序性,以及它与 Mutex 的边界。

  5. 并发编程(七):volatile——从语言规则到 CPU

    沿用 counter + ready 的例子,从 Java 内存模型一路看到 HotSpot 与 x86-64,理解 volatile 如何提供可见性和有序性,以及它与 Atomic、Mutex 的边界。

  6. 并发编程(五):Atomic——语言层的原子性、可见性与有序性

    继续使用 counter 与 ready,从语言内存模型和公开 API 规则理解 Java AtomicInteger、Go sync/atomic 与 CPython 的 Atomic 语义边界。

  7. 并发编程(三):互斥锁——语言层的原子性、可见性与有序性

    继续使用 counter++,理解互斥锁如何提供原子性、可见性和有序性,并比较 Java synchronized、Go sync.Mutex 与 CPython threading.Lock 的语义差异。