Concurrency Programming (12): Finale — Series Summary
A look back at concurrency correctness, shared memory and message passing, and the five-layer view connecting concurrency tools to hardware.

Table of Contents
1. Looking Back at the Series
It all began with a simple example in Article 0: if multiple execution units perform count++ concurrently, will the final result necessarily be what we expect?
That question introduced three aspects of concurrency correctness: atomicity, visibility, and ordering. They became the foundation for the rest of the series.
For collaboration between execution units within a single process on one machine, we followed two main approaches:
| Shared Memory | Message Passing | |
|---|---|---|
| How they cooperate | Access shared state directly | Exchange messages |
| Main tools | Mutex, Atomic, volatile, ReadWriteLock |
BlockingQueue, Channel, queue.Queue |
| Main concern | Coordinating access to shared state | Message handoffs and execution coordination |
Articles 3 through 8 focused first on shared memory. From mutexes and atomic operations to volatile and read-write locks, they examined the language-level guarantees and underlying implementations of these synchronization mechanisms.
Articles 9 and 10 turned to message passing. Starting with the history and semantics of message-based communication, they went on to explore how BlockingQueue, channels, and queue.Queue work internally.
Article 11 brought the two approaches together, exploring how the models relate and how they can be combined in practice.
Returning to the layered diagram introduced in Article 0, the two collaboration models—and the language rules and implementations behind them—fit into the same five-layer view:
Concurrency Tools
├──→ Java: synchronized / Lock / Atomic / BlockingQueue
├──→ Go: Mutex / Atomic / Channel
└──→ Python: Lock / Queue / asyncio
↓
Language Memory Model / Concurrency Semantics
├──→ Java: Java Memory Model
├──→ Go: Go Memory Model
└──→ Python: Python / CPython Concurrency Semantics
↓
Runtime / Language Implementation
├──→ Java: HotSpot JVM (Interpreter / JIT / Runtime)
├──→ Go: Go Runtime
└──→ Python: CPython Interpreter / Runtime
↓
Operating System
└──→ Threads / Scheduler / Semaphores / Futexes / Condition Variables
↓
Hardware
├──→ ISA: x86-64 / ARM64
├──→ Microarchitecture: Cache / Store Buffer / Reorder Buffer / Out-of-Order Execution
└──→ Physical Hardware: CPU / DRAM / Interconnect
2. Closing Thoughts
This concludes the concurrency programming series.
I hope the series offers more than a guide to individual concurrency tools: a coherent view of how collaboration models, language rules, and their underlying implementations fit together.
Discussion
Sign in with GitHub to comment. Discussions are stored as GitHub Issues.View on GitHub