介绍
单例模式指只能被实例化一次
特点:
a) 类构造器私有
b) 持有自己类型的属性
c) 对外提供获取实例的静态方法
在实现上有懒汉方式,饿汉方式,懒汉加锁,双重锁,sync.Once实现等不同的实现方法。代码示例
a) 懒汉方式
type singleton struct{}
var ins *singleton
func GetIns() *singleton{
if ins == nil {
ins = &singleton{}
}
return ins
}
缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。
b) 饿汉方式
type singleton struct{}
var ins *singleton = &singleton{}
func GetIns() *singleton{
return ins
}
缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。
c) 懒汉加锁
type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{
mu.Lock()
defer mu.Unlock()
if ins == nil {
ins = &singleton{}
}
return ins
}
缺点:虽然解决并发的问题,但每次加锁是要付出代价的
d) 双重锁
type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{
if ins == nil {
mu.Lock()
defer mu.Unlock()
if ins == nil {
ins = &singleton{}
}
}
e) sync.Once实现
type singleton struct{}
var ins *singleton
var once sync.Once
func GetIns() *singleton {
once.Do(func(){
ins = &singleton{}
})
return ins
}
推荐采用此方法。
sync.Once是golang提供的方法,一旦执行一次,就不再执行。
有疑问加站长微信联系(非本文作者)