一、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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部