定義
單例對象的類必須保證只有一個實例存在,全局有唯一接口訪問。
實現1-懶漢方式
type singleton struct{}
var ins *singleton
func GetIns() *singleton{
if ins == nil {
ins = &singleton{}
}
return ins
}
缺點:非線程安全。當正在創建時,有線程來訪問此時ins = nil就會再創建,單例類就會有多個實例了。
實現2-餓漢方式
type singleton struct{}
var ins *singleton = &singleton{}
func GetIns() *singleton{
return ins
}
缺點:如果singleton創建初始化比較複雜耗時時,加載時間會延長。
實現3-懶漢加鎖
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
}
缺點:雖然解決併發的問題,但每次加鎖是要付出代價的
實現4-懶漢初始加鎖
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{}
}
}
return ins
}
避免了每次加鎖,提高代碼效率
實現5-sync.Once實現
type singleton struct{}
var ins *singleton
var once sync.Once
func GetIns() *singleton {
once.Do(func(){
ins = &singleton{}
})
return ins
}
關於sync.Once的介紹,請參考:https://www.sunansheng.com/archives/37.html
聲明:Nansheng.Su 發表於 2019-05-13 16:28:31 ,共計169字。
轉載請署名:golang單例模式 | www.sunansheng.com