golang單例模式

定義

單例對象的類必須保證只有一個實例存在,全局有唯一接口訪問。

實現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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章