保证一个类仅有一个实例,并提供一个访问它的全局访问点。
懒汉式
这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁,所以严格意义上它并不算单例模式。 这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。
type Singleton struct {
}
var singleton *Singleton
func GetInstance() *Singleton {
// 如果为空,则创建单例
if singleton == nil {
singleton = &Singleton{}
}
return singleton
}
线程安全
var (
once sync.Once
instance *Singleton
)
type Singleton struct {
}
func GetInstance() *Singleton {
if instance == nil {
once.Do(func() {
instance = &Singleton{}
})
}
return instance
}