前言
golang内存模型是什么:
golang面试经常被问到内存模型,不知道怎回答。不知道面试官考察什么。今天就带你来了解golang内存模型
一、什么是go的内存模型?
指定了一系列条件,在这些条件下,可以保证在协程中对变量的读取操作可以观察到其他协程对同一变量写操作的结果,这就是go内存模型。
二、为什么需要这些条件?
因为编译器无法保证指令执行顺序与程序书写顺序一致。
如下示例:
package main
func main() {
i := 5
go func() {
i = 10
}()
for j := 0;j<100;j++ {
fmt.Println(i)
}
}
多运行几次,会发现结果可能不同,但可以发现,部分Println打印的i变量依然是5,说明未能立观察到协程对i变量的写操作。
所以我们为了保证协程间的变量读取的可观察,就需要建立Happen Before关系的同步事件。也就是内存模型设定的条件。
三、Happen Before
以下几种方式,可以建立Happen Before关系的同步事件:
1.init函数
2.创建/销毁goroutine
3.channel
4.锁
5.Once<