golang中遇到的坑之 sync.once.do()
源码:
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() }}
这个方法的定义是,只要f函数被执行一次之后就不会再执行,那么弊端就很明显了,如果f函数执行失败需要重新执行的时候,是不能被满足的。
如果需要写单例模式,但是单例初始化依赖于网络或者会出现失败需要重试的时候,还是自己乖乖的用锁来实现吧,不要偷懒用once.do
有疑问加站长微信联系(非本文作者)