一、Go 内存模型核心:Happens-Before
Go 语言内存模型定义了在一个 goroutine 中对变量的写入何时能被另一个 goroutine 的读取可见。这是并发编程的理论基石,也是无数 BUG 的根源所在。
1.1 为什么要定义内存模型?
现代编译器和 CPU 都会进行重排优化——在不改变单线程语义的前提下,重新排列指令的执行顺序以提升性能。在并发场景下,这种重排可能导致其他 goroutine 观察到"不可能"的状态。
程序顺序(Program顺序)不等同于执行顺序,而内存模型就是语言层面给程序员的"承诺":在满足特定条件时,保证操作之间的可见性顺序。
1.2 Happens-Before 关系
"happens-before"是 Go 内存模型的核心概念:如果事件 e1 happens-before e2,那么 e2 一定能看到 e1 的结果。这个关系构成偏序集,是判断并发程序正确性的数学工具。
1.3 单 goroutine 内的 happens-before
在单个 goroutine 内,程序顺序等于 happens-before 顺序。编译器可以重排,但必须保证"as-if"语义——单线程执行的结果不变。
1.4 同步原语建立的跨 goroutine happens-before
跨 goroutine 的 happens-before 关系通过同步操作建立:
• goroutine 的创建:go f() 语句 happens-before f() 的所有操作
• channel 的发送:ch

发表评论 取消回复