sync / atomic.once.go中的代码是:
func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { //A //if o.done == 1 { return } // Slow-path. o.m.Lock() defer o.m.Unlock() if o.done == 0 { f() atomic.CompareAndSwapUint32(&o.done, 0, 1) //B //o.done = 1 } }
我不认为上面两个“原子样式”代码A,B是必要或有用的。我认为该锁已足够,如果A,B不是原子样式,则可以。我必须错过一些事情,请告诉我代码A,B的目的。谢谢。
在原来是正确的。原因是Go 内存模型说,没有同步(if o.done == 1),对o.done的更改可能根本不会被观察到。
if o.done == 1