错误示例
type singleton struct {}
var instance *singleton
func GetInstance() *singleton {
if instance == nil {
instance = &singleton{} // 不是并发安全的
}
return instance
}
不优雅示例
func GetInstance() *singleton {
mu.Lock() // 如果实例存在没有必要加锁
defer mu.Unlock()
if instance == nil {
instance = &singleton{}
}
return instance
}
加锁可以保证每次拿到相同实例,但是如果已经实例化,再调用函数,依然有锁存在,浪费性能,不够优雅;
优雅示例
import (
"sync"
)
type singleton struct {}
var instance *singleton
var once sync.Once
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}
该实现利用sync.Once
类型去同步对GetInstance()
的访问,并确保我们的类型仅被初始化一次。