我很困惑,下面的片段是否完美?
import "sync"
import "sync/atomic"
var initialized uint32
var instance *singleton
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}
atomic.StoreUint32(&initialized, 1)会将实例刷新到所有 CPU 吗?我想我需要添加一个原子存储和加载,例如下面的代码片段
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
atomic.StorePointer(&instance, &singleton{})
})
return atomic.LoadPointer(&instance)
}
我认为 Once.Do 只保证执行函数 f 一次。并且atomic.StoreUint32(&o.done, 1)只是 o.done 的内存屏障。它不能确保instance全局可见
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
九州编程
相关分类