在Go語言中,互斥鎖(Mutex)是一種同步原語,用于確保多個goroutine在訪問共享資源時不會發(fā)生沖突?;コ怄i通過鎖定和解鎖操作來實現(xiàn)對共享資源的獨占訪問。當(dāng)一個goroutine獲得鎖時,其他嘗試獲得該鎖的goroutine將被阻塞,直到鎖被釋放。
Go語言的sync
包提供了Mutex
結(jié)構(gòu)體和相關(guān)的方法來實現(xiàn)互斥鎖。以下是一個簡單的示例,展示了如何使用互斥鎖來保護(hù)共享資源:
package main
import (
"fmt"
"sync"
"time"
)
var (
counter = 0
mutex sync.Mutex
)
func increment() {
mutex.Lock() // 獲取鎖
counter++
mutex.Unlock() // 釋放鎖
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait() // 等待所有g(shù)oroutine完成
fmt.Println("Counter:", counter)
}
在這個示例中,我們有一個全局變量counter
和一個互斥鎖mutex
。increment
函數(shù)用于遞增counter
,但在執(zhí)行遞增操作之前,我們首先通過調(diào)用mutex.Lock()
獲取鎖。這樣可以確保在同一時間只有一個goroutine能夠訪問counter
。在遞增操作完成后,我們通過調(diào)用mutex.Unlock()
釋放鎖,以便其他goroutine可以獲取鎖并執(zhí)行遞增操作。
main
函數(shù)中,我們創(chuàng)建了1000個goroutine來并發(fā)地調(diào)用increment
函數(shù)。通過使用sync.WaitGroup
,我們可以確保在所有g(shù)oroutine完成之前,主線程不會退出。最后,我們打印出遞增后的counter
值。
總之,Go語言中的互斥鎖通過鎖定和解鎖操作來確保多個goroutine在訪問共享資源時不會發(fā)生沖突,從而實現(xiàn)線程安全的數(shù)據(jù)訪問。