go?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解
Go 語(yǔ)言的sync包
Go 語(yǔ)言的 sync
包提供了一些基本的同步原語(yǔ),如互斥鎖(Mutex)和等待組(WaitGroup)。這些原語(yǔ)可以幫助你在多個(gè) Go Routine 之間同步狀態(tài)。
Mutex
互斥鎖是一種同步工具,用于保證多個(gè) Go Routine 在訪(fǎng)問(wèn)共享資源時(shí)的互斥性。
創(chuàng)建 Mutex:
var m sync.Mutex
使用 Mutex:
m.Lock() // 臨界區(qū),只有獲得鎖的 Go Routine 才能訪(fǎng)問(wèn) m.Unlock()
例如,假設(shè)我們有一個(gè)計(jì)數(shù)器## sync 包的使用
Go 語(yǔ)言的 sync
包提供了一些基本的同步原語(yǔ),如互斥鎖(Mutex)和等待組(WaitGroup)。這些原語(yǔ)可以幫助你在多個(gè) Go Routine 之間同步狀態(tài)。
Mutex
互斥鎖是一種同步工具,用于保證多個(gè) Go Routine 在訪(fǎng)問(wèn)共享資源時(shí)的互斥性。
創(chuàng)建 Mutex:
var m sync.Mutex
使用 Mutex:
m.Lock() // 臨界區(qū),只有獲得鎖的 Go Routine 才能訪(fǎng)問(wèn) m.Unlock()
例如,假設(shè)我們有一個(gè)計(jì)數(shù)器,我們希望它能在多個(gè) Go Routine 之間安全地使用:
package main import ( "fmt" "sync" "time" ) type SafeCounter struct { v map[string]int mux sync.Mutex } func (c *SafeCounter) Inc(key string) { c.mux.Lock() c.v[key]++ c.mux.Unlock() } func (c *SafeCounter) Value(key string) int { c.mux.Lock() defer c.mux.Unlock() return c.v[key] } func main() { c := SafeCounter{v: make(map[string]int)} for i := 0; i < 1000; i++ { go c.Inc("somekey") } time.Sleep(time.Second) fmt.Println(c.Value("somekey")) }
在這個(gè)例子中,SafeCounter 的每個(gè)方法在操作 v 之前都會(huì)鎖定 Mutex 來(lái)確保安全訪(fǎng)問(wèn)。
WaitGroup
WaitGroup 是用于等待一組 Go Routines 完成的結(jié)構(gòu)。
使用 WaitGroup:
var wg sync.WaitGroup
每次一個(gè) Go Routine 啟動(dòng)時(shí),我們調(diào)用 wg.Add(1)
。每次一個(gè) Go Routine 完成時(shí),我們調(diào)用 wg.Done()
。我們可以使用 wg.Wait()
來(lái)阻塞,直到所有的 Go Routines 完成。
例如,假設(shè)我們啟動(dòng)了多個(gè) Go Routine 來(lái)完成一些工作,我們希望等待它們?nèi)客瓿桑?/p>
package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() }
在這個(gè)例子中,我們使用 WaitGroup 來(lái)等待 5 個(gè) worker Go Routines 完成。
總結(jié)
Go 語(yǔ)言的 sync
包提供了互斥鎖和等待組等同步原語(yǔ),它們可以幫助我們?cè)诙鄠€(gè) Go Routine 之間同步狀態(tài)。雖然 Go 語(yǔ)言的并發(fā)模型主要是基于 Channels 的,但在某些情況下,使用 sync
包提供的同步原語(yǔ)可能會(huì)更加方便或有效。
以上就是go sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解的詳細(xì)內(nèi)容,更多關(guān)于go sync包互斥鎖等待組的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Go語(yǔ)言實(shí)現(xiàn)類(lèi)似tree命令的小程序
tree?命令是一個(gè)小型的跨平臺(tái)命令行程序,用于遞歸地以樹(shù)狀格式列出或顯示目錄的內(nèi)容。本文將通過(guò)Go語(yǔ)言實(shí)現(xiàn)類(lèi)似tree命令的小程序,需要的可以參考一下2022-10-10GO語(yǔ)言實(shí)現(xiàn)批量壓縮圖片和水印
這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)批量壓縮圖片和水印,主要用到了github.com/nfnt/resize這個(gè)第三方庫(kù),僅僅支持JPG圖片格式,有相同需求的小伙伴參考下吧。2015-03-03Golang中map的三種聲明定義方式實(shí)現(xiàn)
本文主要介紹了Golang中map的三種聲明定義方式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Golang Http 驗(yàn)證碼示例實(shí)現(xiàn)
這篇文章主要介紹了Golang Http 驗(yàn)證碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08go語(yǔ)言中線(xiàn)程池的實(shí)現(xiàn)
Go語(yǔ)言中并沒(méi)有直接類(lèi)似 Java 線(xiàn)程池的內(nèi)建概念,主要通過(guò)goroutine和channel來(lái)實(shí)現(xiàn)并發(fā)處理,本文主要介紹了go語(yǔ)言中線(xiàn)程池的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04