Go 函數並發程式設計中提供了三種鎖定類型:互斥鎖(Mutex)、讀寫鎖定(RWMutex)、一次性鎖定(Once)。互斥鎖保證獨佔訪問,讀寫鎖允許並發讀取和單一寫入,一次性鎖定確保程式碼區塊僅執行一次。這些鎖用於協調對共享資源的訪問,防止資料競爭。實務上,互斥鎖可確保並發 web 服務中的資料一致性,阻止並發請求同時修改共用資料結構。
在Go 函數並發程式設計中,鎖定是一種同步機制,用於協調對共享資源的訪問,防止資料競爭。 Go 中提供了多種類型的鎖,每種鎖都有不同的特性和適用場景。
互斥鎖(Mutex)是一個基礎的鎖,只能同時允許一個 goroutine 取得資源。它保證了對共享資源的獨佔存取。
import ( "sync" "fmt" ) var ( mu sync.Mutex counter int ) func main() { for i := 0; i < 1000; i++ { go func() { mu.Lock() counter++ mu.Unlock() }() } fmt.Println("Final counter value:", counter) }
讀寫鎖定(RWMutex)允許多個 goroutine 並發讀取共享資源,但只有一個 goroutine 可以同時寫入資源。
import ( "sync" "fmt" ) var ( rwmu sync.RWMutex shared []int ) func main() { // 多个 goroutine 并发读取共享切片 for i := 0; i < 1000; i++ { go func() { rwmu.RLock() fmt.Println("Read:", shared) rwmu.RUnlock() }() } // 单独的 goroutine 写入共享切片 go func() { rwmu.Lock() shared = append(shared, 1, 2, 3) rwmu.Unlock() }() }
Once 是一個一次性鎖定,用於確保特定程式碼區塊只執行一次。
import ( "sync" "fmt" ) var ( initOnce sync.Once inited = false ) func initialize() { inited = true fmt.Println("Initialized") } func main() { initOnce.Do(initialize) if inited { fmt.Println("Already initialized") } else { fmt.Println("Not initialized") } }
假設有一個 web 服務,其中多重並發請求需要操作同一個共享資料結構。為了確保資料的一致性,可以使用互斥鎖來保護資料結構,阻止並發請求同時對其進行修改。
import ( "sync" "net/http" ) var ( mu sync.Mutex clients map[string]*http.Client ) func main() { http.HandleFunc("/addClient", func(w http.ResponseWriter, r *http.Request) { mu.Lock() clients[r.FormValue("name")] = &http.Client{} mu.Unlock() }) }
在本例中,使用互斥鎖mu
保護對clients
地圖的並發訪問,確保在同一時間只有一個請求可以新增或修改客戶訊息,從而避免了數據競爭。
以上是Golang函數並發程式設計中鎖的類型和用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!