單例模式
解決的問題
保證一個環(huán)境只有一個實例在運行滩愁。解決一個全局使用的類頻繁的創(chuàng)建和銷毀碗旅。
優(yōu)點
- 內(nèi)存中只有一個實例,減少內(nèi)存開銷
- 避免對資源的多重占用线定,比如寫文件的操作
缺點
- 沒有接口,不能繼承酒繁。
代碼實現(xiàn)
1. 懶漢模式
缺點:非線程安全孽惰,當正在創(chuàng)建時,如果有線程來訪碑隆,Instance == nil時恭陡,會重復創(chuàng)建,就不是單例模式了上煤。
type Singleton struct{}
var Instance *Singleton
func GetInstance() *Singleton {
if Instance == nil {
Instance = &Singleton{}
}
return Instance
}
2. 餓漢模式
缺點:如果Singleton結(jié)構(gòu)體創(chuàng)建比較耗時休玩,加載時間會很長。
type Singleton struct{}
var Instance2 *Singleton = &Singleton{}
func GetInstance2() *Singleton {
return Instance2
}
3. 帶鎖的懶漢模式
缺點:反復加鎖會導致線程阻塞
var Instance3 *Singleton
var mut sync.Mutex
func GetInstance3() *Singleton {
mut.Lock()
defer mut.Unlock()
if Instance3 == nil {
Instance3 = &Singleton{}
}
return Instance3
}
4. 雙重鎖的懶漢模式
缺點:實現(xiàn)較復雜
優(yōu)點: 性能提高
var Instance4 *Singleton
var mut2 sync.Mutex
func GetInstance4() *Singleton {
if Instance4 == nil {
mut2.Lock()
defer mut2.Unlock()
if Instance4 == nil {
Instance4 = &Singleton{}
}
}
return Instance4
}
5. Once實現(xiàn)懶漢模式
golang的sync包中,提供once鎖once.Do(func(){})中的函數(shù)只會執(zhí)行一次拴疤。這樣的代碼看上去也比較簡潔永部。
var Instance5 *Singleton
var once sync.Once
func GetInstance5() *Singleton {
once.Do(func() {
Instance5 = &Singleton{}
})
return Instance5
}