不安全的双检锁 从其他语言转入Go语言的同学经常会陷入一个思考:如何创建一个单例? 有些同学可能会把其它语言中的双检锁模式移植过来,双检锁模式也称为懒汉模式,首次用到的时候才创建实例.大部分人首次用Golang写出来的实例大概是这样的: type Conn struct { Addr string State int } var c *Conn var mu sync.Mutex func GetInstance() *Conn { if c == nil { mu.Lock() defer m
多处理器使用松散的内存模型可能会非常混乱,写操作可能会无序,读操作可能会返回不是我们想要的值,为了解决这些问题,我们需要使用内存栅栏(memory fences),或者说内存屏障(memory barrier). X86平台可能还算是使用松散内存模型的多处理器中还算比较好的了,它针对内存顺序有一定的规范要求,原文如下: Loads are not reordered with other loads. Stores are not reordered with other stores. Sto