單例模式雖然理解起來比較簡單,但是真正實現的時候有很多細節需要考慮,一般考慮點有如下幾個:
建構函式需要是 private 訪問許可權的,這樣才能避免外部通過 new 建立例項
考慮物件建立時的執行緒安全問題
考慮是否支援延遲載入
考慮 getinstance() 效能是否高(是否加鎖)
語法不同,對於這幾點關注程度也不同。對於go語言,在這裡提供一種寫法,使用sync.once.do。該函式的作用是只執行一次。
所以我們可以這麼寫:
type single struct
var(
once sync.once
single *single
)func
getsingleinstance()
*single })
return single
}
無論多少請求,只會有乙個single的例項。
現在我們思考乙個場景,如果突然有100個請求同時請求getsingleinstance介面,這些請求是會等do執行完還是無視do直接return single呢?
理論上是需要等do執行完的,否則返回的single為空,會導致嚴重錯誤。雖然是這麼想,不過還是做個測試吧。
package main
import
("fmt"
"strconv"
"sync"
"time"
)func
main()
for i :=
0; i <
5; i++
(j)}
fmt.
println
("finished"
) time.
sleep
(time.second *10)
}
測試方案很簡單,啟動5個goroutine,同時呼叫do,oncebody設定sleep 5秒,只要檢查輸出,就能判斷是否會阻塞。
執行結果如下:
➜ myproject go run main.go
finished
0only once start24
31only once end
lll2
lll4
lll0
lll1
lll3
可以看出,只有do執行完畢後,所有goroutine才會輸出,證明do都會被呼叫,但只有乙個會真正執行,在真正的執行完前,其它goroutine會被阻塞。
其實這裡有乙個隱藏風險,如果do執行的函式很耗時,會導致大量goroutine累積,程式設計的時候需要考慮到這一點。
do這個功能是如何實現的呢?讓我們看一下原始碼:
func
(o *once)
do(f func()
)}func
(o *once)
doslow
(f func()
)}
多個協程檢視done值為0,進入doslow,只有乙個協程會獲得鎖,其它協程別阻塞。
其實用到的都是比較常規的技術,主要是互斥鎖、訊號量、defer,但是設計上還是很巧妙的。這也是go的乙個優勢,解決衝突使用鎖,快速、安全、方便,但是需要考慮好效能問題。
我的個人部落格為:
技術
go設計模式(4)-**編寫
go設計模式(3)-設計原則
go設計模式(2)-物件導向分析與設計
支付接入常規問題
http2.0基礎教程
go設計模式(1)-語法
mysql開發規範
https配置實戰
go通道實現原理
go定時器實現原理
https連線過程
限流實現2
秒殺系統
分布式系統與一致性協議
微服務之服務框架和註冊中心
beego框架使用
**微服務
tcp效能優化
限流實現1
redis實現分布式鎖
golang原始碼bug追查
事務原子性、一致性、永續性的實現原理
cdn請求過程詳解
常用快取技巧
如何高效對接第三方支付
gin框架簡潔版
innodb鎖與事務簡析
演算法總結
讀書筆記原則
資治通鑑
敏捷革命
如何鍛鍊自己的記憶力
簡單的邏輯學-讀後感
熱風-讀後感
論語-讀後感
孫子兵法-讀後感
思考
反對自由主義
實踐論評價自己的標準
服務端團隊假期值班方案
專案流程管理
對專案管理的一些看法
對產品經理的一些思考
關於程式設計師職業發展的思考
關於**review的思考
Go實現設計模式 單例模式
確保乙個類只有乙個例項並提供乙個全域性訪問點。意圖 再專案中有執行緒池,快取,對話方塊等,這類物件只能有乙個,如果創造多個就會有許多問題,所以有了單例模式。關鍵 僅僅針對golang 在方法中要有getinstance 來建立物件,且為了防止多執行緒錯誤記得加鎖 這個頁面的作者將 寫的很詳細了,可以...
Go 單例模式
單例模式,是一種常用的軟體設計模式,在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以包在系統中乙個類只有乙個例項且該例項易於訪問,從而方便對例項個數的控制並節約系統資源。懶漢模式 lazy loading 懶漢模式是開源專案中使用最多的一種,最大的缺點是非執行緒安全的。type sin...
golang mysql 單例 Go的單例模式
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。1.go實現非執行緒安全的單例模式 懶漢 ...