單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。
1.go實現非執行緒安全的單例模式(懶漢 就是很懶的單例 哈哈):
package singleton
type singleton struct //
return instance
packagesingleton
typesingletonstruct//
returninstance
非執行緒安全的單例模式是大家用得最多的一種。在github上面的開源專案有很多都使用了非執行緒安全的。
這種寫法lazy loading很明顯,但是致命的是在多執行緒不能正常工作。
2.go實現帶執行緒鎖的單例模式
var mu sync.mutex
func getinstance() *singleton
return instance
varmusync.mutex
funcgetinstance()*singleton
returninstance
這裡用了go的
sync.mutex
sync.mutex
sync/mutex是go語言底層基礎物件之一,用於構建多個goroutine間的同步邏輯,因此被大量高層物件所使用。
其工作模型類似於linux核心的futex物件,具體實現極為簡潔,效能也***。
mutex物件僅有兩個數值字段,分為為state(儲存狀態)和sema(用於計算休眠goroutine數量的訊號量)。
初始化時填入的0值將mutex設定在未鎖定狀態,同時保證時間開銷最小。
這一特性允許將mutex作為其它物件的子物件使用。
3.帶檢查鎖的的單例模式
func getinstance() *singleton
return instance
funcgetinstance()*singleton
returninstance
這是乙個不錯的方法,但是還並不是很完美。因為編譯器優化沒有檢查例項儲存狀態。如果使用sync/atomic包的話 就可以自動幫我們載入和設定標記。
import "sync"
import "sync/atomic"
var initialized uint32
func getinstance() *singleton
atomic.storeuint32(&initialized, 1)
return instance
import"sync"
import"sync/atomic"
varinitializeduint32
funcgetinstance()*singleton
atomic.storeuint32(&initialized,1)
returninstance
個人覺得比較好的在go中使用單例設計的是這種
package singleton
import (
"sync"
type singleton struct
return instance
packagesingleton
import(
"sync"
typesingletonstruct
returninstance
通過使用sync.once 包可以實現執行緒安全的單例模式。
如果寫得有什麼不對地方歡迎指出。
go的單例模式
Go 單例模式
單例模式,是一種常用的軟體設計模式,在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以包在系統中乙個類只有乙個例項且該例項易於訪問,從而方便對例項個數的控制並節約系統資源。懶漢模式 lazy loading 懶漢模式是開源專案中使用最多的一種,最大的缺點是非執行緒安全的。type sin...
Go單例實現方案
單例模式雖然理解起來比較簡單,但是真正實現的時候有很多細節需要考慮,一般考慮點有如下幾個 建構函式需要是 private 訪問許可權的,這樣才能避免外部通過 new 建立例項 考慮物件建立時的執行緒安全問題 考慮是否支援延遲載入 考慮 getinstance 效能是否高 是否加鎖 語法不同,對於這幾...
go設計模式之單例模式
在這裡插入描述 go設計模式之單例模式 在軟體開發時,經常會遇到有些物件需要保證只有乙個例項的,那麼這種設計模式就應用而生。單例模式,也叫單子模式,是一種常用的軟體設計模式,屬於建立型模式的一種。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣...