Go 并发
从 Channel 到内存模型,再到无锁与并发模式。
-
Go 并发(五):并发模式与最佳实践
Go 的并发编程远不止 goroutine + channel。生产级代码需要掌握 context 传播与取消树、errgroup 有界并发、worker pool 模式、graceful shutdown 全流程、race detector 的 CI 集成,以及至少十种常见反模式的识别与规避。本文是"如何在生产环境写出正确并发 Go 代码"的完整指南。
-
Go 并发(四):无锁编程层次-从 CAS 到消除共享
CAS 既是乐观锁也是无锁编程,不矛盾——"乐观锁"描述并发策略,"无锁"描述实现方式(不用 mutex)。比 CAS 更激进的方向是 FAA(一次成功)→ 分片(消除共享)→ RCU(读者零开销)。
-
Go 并发(三):内存模型、happens-before 与同步语义
Go 内存模型定义了 happens-before 偏序关系,它是 sequenced-before(单 goroutine 内语句顺序)和 synchronized-before(跨 goroutine 同步操作)的传递闭包。只有通过 happens-before 关联的写操作才保证对读操作可见。2022 年(Go 1.19)修订正式赋予 sync/atomic 顺序一致性语义,与 C++ seq_cst、Java volatile 对齐。任何存在 data race 的 Go 程序行为未定义——不存在"良性竞争"。
-
Go 并发(二):sync 包与并发原语
sync 包的每个原语都围绕同一个核心模式:fast path 用 atomic 无锁操作,slow path 用 runtime semaphore 休眠/唤醒。Mutex 通过 normal/starvation 双模式平衡吞吐与尾延迟;sync.Map 在 Go 1.24 重写为 HashTrieMap(并发哈希字典树);sync.Pool 利用 per-P 本地存储 + victim cache 实现两轮 GC 缓冲。理解这些内部结构,才能在正确的场景选择正确的原语。