1.单例模式
单例模式采用了 饿汉式 和 懒汉式 两种实现,个人其实更倾向于饿汉式的实现,简单,并且可以将问题及早暴露,懒汉式虽然支持延迟加载,但是这只是把冷启动时间放到了第一次使用的时候,并没有本质上解决问题,并且为了实现懒汉式还不可避免的需要加锁。
- 饿汉式
package singleton
//饿汉式单例
type Singleton struct{}
var singleton *Singleton
//采用init性能会更好一些
func init() {
singleton = &Singleton{}
}
//获取单例
func GetInstance() *Singleton {
return singletons
}
-
懒汉式(双重检测)
(1)采用once.Do()函数实现,可以控制函数只调用一次,来确保单例
package singleton
import "sync"
var (
lazySingleton *Singleton
once = &sync.Once{}
)
// 懒汉式
func GetLazyInstance() *Singleton {
if lazySingleton == nil {
once.Do(func() {
lazySingleton = &Singleton{}
})
}
return lazySingleton
}
(2)采用互斥锁实现
package main
import (
"fmt"
"sync"
)
type Singleton struct {
}
var instance *Singleton
var mu sync.Mutex
//懒汉式加锁实现
func GetInstance() *Singleton {
mu.Lock()
defer mu.Unlock()
if instance == nil {
instance = &Singleton{}
}
return instance
}
func main() {
s := GetInstance()
fmt.Printf("get instance succ,s=%+v", s)
}