面试被问go的内存模型,怎么回答

Go语言内存模型确保了在特定条件下,协程间变量读写的一致性。本文深入探讨了Happen Before原则,包括初始化函数、Goroutine创建/销毁、channel、锁和sync.Once的同步事件。通过示例,解释了如何建立和理解这些同步关系,以确保并发安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

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<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值