var once sync.Once
func GetInstance() *Tool {
once.Do(func() {
instance =new(Tool)
})
return instance
}
sync.Once内部本质上也是双重检查的方式,但在写法上会比自己写双重检查更简洁,以下是Once的源码
func (o *Once) Do(f func()) {
//判断是否执行过该方法,如果执行过则不执行
ifatomic.LoadUint32(&o.done) ==1 {
return }
// Slow-path.o.m.Lock() defer o.m.Unlock()
//进行加锁,再做一次判断,如果没有执行,则进行标志已经扫行并调用该方法
ifo.done ==0 {
defer atomic.StoreUint32(&o.done,1)
f()
}
}