fanlv / blog

0 stars 0 forks source link

2020/06/09/golang-memory-model/ #5

Open utterances-bot opened 1 month ago

utterances-bot commented 1 month ago

Golang Memory Model

行万里路,读万卷书

https://fanlv.fun/2020/06/09/golang-memory-model/

RoaringWind commented 1 month ago

您好,读文章有一个问题,请教一下: 在3.3的改造代码里,您写的是

instance = &UserInfo{
    Age: 18,
}
atomic.StoreUint32(&flag, 1)

如果这里发生了指令重排,变成了以下顺序

atomic.StoreUint32(&flag, 1)
instance = &UserInfo{
    Age: 18,
}

这样别的线程读取的时候岂不是会读到nil的instance呢?

fanlv commented 1 month ago

您好,读文章有一个问题,请教一下: 在3.3的改造代码里,您写的是

instance = &UserInfo{
    Age: 18,
}
atomic.StoreUint32(&flag, 1)

如果这里发生了指令重排,变成了以下顺序

atomic.StoreUint32(&flag, 1)
instance = &UserInfo{
    Age: 18,
}

这样别的线程读取的时候岂不是会读到nil的instance呢?

@RoaringWind Golang 中的 Atomic 主要保证了三件事,原子性、可见性、有序性。所以编译器不会这样乱重排。 具体可以看下 3.1 里面 atomic 的介绍。

RoaringWind commented 1 month ago

感谢解惑。文章中已经不可用的一篇参考文献新地址如下:探索 golang 一致性原语