sync.Once
实际上golang标准库里的sync.Once就是采用atomic实现的双重检查锁,所以golang里的最佳实践是直接使用sync.Once
type Singleton struct {
A int64
}
var ins *Singleton
var once sync.Once
func main() {
fmt.Println("start ", ins)
getInstance(1)
fmt.Println("1 : ", ins)
getInstance(3)
fmt.Println("3 : ", ins)
}
func getInstance(a int64) {
once.Do(func() {
fmt.Println("once")
ins = &Singleton{A: a}
})
}
输出结果
start <nil>
once
1 : &{1}
3 : &{1}