Go 并发编程 专栏导览

专栏定位

本专栏聚焦 Go 并发编程的核心机制与实战模式——Go 的并发模型基于 CSP(Communicating Sequential Processes),以 Goroutine + Channel 为核心原语,配合 GMP 调度器实现了轻量级的用户态线程。本专栏从 GMP 调度器的设计出发,深入 Channel 的底层结构、sync 包的锁和同步原语、Context 的取消传播,最终落地到常见的并发模式和生产实践。

目标读者

  • 日常写 Go 并发代码但希望理解 Goroutine 调度和 Channel 底层机制的开发者
  • 需要排查 Goroutine 泄漏、死锁、数据竞争等并发 Bug 的工程师
  • 对用户态线程调度和 CSP 并发模型感兴趣的技术爱好者

专栏目录

序号标题核心内容
0101 Goroutine 与 GMP 调度器Goroutine 的轻量级(2KB 初始栈 vs 线程的 MB 级栈)、GMP 模型(G/M/P 三者关系)、调度循环(schedule → execute → goexit)、抢占式调度(Go 1.14 信号抢占)、Goroutine 栈的动态伸缩
0202 Channel 的底层结构与阻塞唤醒机制hchan 结构体(buf 环形缓冲区/sendq/recvq 等待队列)、有缓冲 vs 无缓冲 Channel 的语义差异、发送/接收的加锁与 Goroutine 挂起/唤醒(gopark/goready)、select 的随机选择实现、Channel 关闭的广播语义
0303 sync 包——Mutex、RWMutex 与 WaitGroup 的实现Mutex 的两种模式(正常模式 vs 饥饿模式)、自旋与信号量的切换策略、RWMutex 的读写分离(readerCount 的负值技巧)、WaitGroup 的计数器与信号量、sync.Once 的双重检查
0404 sync.Map、sync.Pool 与原子操作sync.Map 的 read/dirty 双 map 设计(读多写少优化)、sync.Pool 的 P 本地缓存与 victim 机制、atomic 包的 CAS/Load/Store、atomic.Value 的无锁读写
0505 Context 的设计与取消传播机制Context 接口的四个方法(Deadline/Done/Err/Value)、WithCancel/WithTimeout/WithDeadline 的实现、取消信号的树形传播、Context 的最佳实践(不要存储在 struct 中/作为第一个参数传递)、context.Value 的滥用与替代方案
0606 Go 并发模式——Pipeline、Fan-out Fan-in 与 Worker PoolPipeline 模式(Channel 串联多个处理阶段)、Fan-out/Fan-in 的并行分发与汇聚、Worker Pool 的 Goroutine 复用、errgroup 的错误传播、rate.Limiter 的令牌桶限流
0707 并发陷阱与调试——Goroutine 泄漏、死锁与 Race DetectorGoroutine 泄漏的常见原因(Channel 未关闭/Context 未取消/阻塞 IO)、pprof 排查 Goroutine 堆栈、死锁的四个条件与 Go 的死锁检测、Race Detector(-race 标志)的实现原理(ThreadSanitizer)、实战排查案例
0808 Go 网络编程——netpoller 与 Goroutine-per-ConnectionGo 的 net 包如何隐藏非阻塞 IO、netpoller 的 epoll/kqueue 封装、Goroutine-per-Connection 模型为何在 Go 中可行、与 Netty Reactor 模型的对比、HTTP/2 和 gRPC 的并发处理

推荐阅读路径

核心原理路径:01 → 02 → 03 → 05

并发模式路径:06 → 04

调试实战路径:07 → 08

前置知识

  • Go 基础语法(goroutine/channel/select 的基本使用)
  • 建议先阅读 Go语言核心 专栏了解 Go 的类型系统和内存分配器
  • 建议了解 Java 并发编程 专栏中的线程模型和锁机制(形成对照)

关联专栏