Go語言標(biāo)準(zhǔn)庫sync.Once使用場景及性能優(yōu)化詳解
Go 語言標(biāo)準(zhǔn)庫sync.Once
sync.Once
是 Go 語言標(biāo)準(zhǔn)庫中提供的一個用于確保某個操作只執(zhí)行一次的機(jī)制。它主要應(yīng)用于在多線程環(huán)境下,保證某個函數(shù)只被調(diào)用一次,通常用于初始化操作。
使用場景
1 單次初始化操作:
sync.Once
常用于在多線程環(huán)境下確保某個初始化操作只被執(zhí)行一次。例如,初始化一個全局的單例對象。
```go var ( singleton *SomeType once sync.Once ) func getSingleton() *SomeType { once.Do(func() { singleton = initializeSingleton() }) return singleton } ```
2 初始化配置信息:
在程序啟動時,可以使用 sync.Once
確保某個配置信息只被初始化一次。
```go var ( config *Config configOnce sync.Once ) func loadConfig() *Config { configOnce.Do(func() { config = loadConfigFromFile() }) return config ```
3 延遲初始化:
有時候,一些對象的初始化操作可能比較耗時,但只有在需要使用這個對象時才進(jìn)行初始化。
```go var ( expensiveObject *ExpensiveType once sync.Once ) func getExpensiveObject() *ExpensiveType { once.Do(func() { expensiveObject = initializeExpensiveObject() }) return expensiveObject ```
性能優(yōu)化
sync.Once
內(nèi)部使用了互斥鎖和原子操作來保證初始化函數(shù)只執(zhí)行一次。它的實現(xiàn)原理包含以下幾個步驟:
互斥鎖保護(hù):
sync.Once
內(nèi)部有一個done
字段,表示初始化是否已經(jīng)完成。在初始化之前,通過互斥鎖保護(hù),防止并發(fā)的多個協(xié)程同時執(zhí)行初始化。原子操作檢查:在執(zhí)行初始化函數(shù)之前,使用原子操作檢查
done
字段,如果初始化已經(jīng)完成,就直接返回,避免多次執(zhí)行初始化。執(zhí)行初始化:如果檢查發(fā)現(xiàn)還未初始化,就執(zhí)行初始化函數(shù)。在初始化過程中,再次檢查
done
字段,防止并發(fā)的其他協(xié)程再次觸發(fā)初始化。
由于 sync.Once
的內(nèi)部實現(xiàn)使用了互斥鎖和原子操作,它在保證只執(zhí)行一次初始化的同時,避免了不必要的鎖競爭,從而提高了性能。
總的來說,sync.Once
在需要確保某個操作只執(zhí)行一次的場景下非常有用,它通過內(nèi)部的互斥鎖和原子操作實現(xiàn)了高效的單次初始化機(jī)制。
以上就是Go語言標(biāo)準(zhǔn)庫sync.Once使用場景及性能優(yōu)化詳解的詳細(xì)內(nèi)容,更多關(guān)于Go標(biāo)準(zhǔn)庫sync.Once的資料請關(guān)注腳本之家其它相關(guān)文章!
- Golang標(biāo)準(zhǔn)庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例
- Go?1.21.0?新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫log/slog使用詳解
- Go標(biāo)準(zhǔn)庫strconv實現(xiàn)string類型與其他基本數(shù)據(jù)類型之間轉(zhuǎn)換
- Go 標(biāo)準(zhǔn)庫增加metrics指標(biāo)探討分析
- Golang標(biāo)準(zhǔn)庫unsafe源碼解讀
- go語言標(biāo)準(zhǔn)庫fmt包的一鍵入門
- Go標(biāo)準(zhǔn)庫-ServeMux的使用與模式匹配深入探究
相關(guān)文章
Go語言構(gòu)建流數(shù)據(jù)pipeline的示例詳解
Go的并發(fā)原語可以輕松構(gòu)建流數(shù)據(jù)管道,從而高效利用?I/O?和多個?CPU,?本文展示了此類pipelines的示例,強(qiáng)調(diào)了操作失敗時出現(xiàn)的細(xì)微之處,并介紹了干凈地處理失敗的技術(shù),希望對大家有所幫助2024-02-02IdeaGo啟動報錯Failed to create JVM的問題解析
這篇文章主要介紹了IdeaGo啟動報錯Failed to create JVM的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Golang在整潔架構(gòu)基礎(chǔ)上實現(xiàn)事務(wù)操作
這篇文章在 go-kratos 官方的 layout 項目的整潔架構(gòu)基礎(chǔ)上,實現(xiàn)優(yōu)雅的數(shù)據(jù)庫事務(wù)操作,需要的朋友可以參考下2024-08-08