在Go語言中,互斥鎖(Mutex)是一種同步原語,用于確保多個goroutine在訪問共享資源時不會發生沖突。互斥鎖通過鎖定和解鎖操作來實現對共享資源的獨占訪問。當一個goroutine獲得鎖時,其他嘗試獲得該鎖的goroutine將被阻塞,直到鎖被釋放。
Go語言的sync
包提供了Mutex
結構體和相關的方法來實現互斥鎖。以下是一個簡單的示例,展示了如何使用互斥鎖來保護共享資源:
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() // 等待所有goroutine完成
fmt.Println("Counter:", counter)
}
在這個示例中,我們有一個全局變量counter
和一個互斥鎖mutex
。increment
函數用于遞增counter
,但在執行遞增操作之前,我們首先通過調用mutex.Lock()
獲取鎖。這樣可以確保在同一時間只有一個goroutine能夠訪問counter
。在遞增操作完成后,我們通過調用mutex.Unlock()
釋放鎖,以便其他goroutine可以獲取鎖并執行遞增操作。
main
函數中,我們創建了1000個goroutine來并發地調用increment
函數。通過使用sync.WaitGroup
,我們可以確保在所有goroutine完成之前,主線程不會退出。最后,我們打印出遞增后的counter
值。
總之,Go語言中的互斥鎖通過鎖定和解鎖操作來確保多個goroutine在訪問共享資源時不會發生沖突,從而實現線程安全的數據訪問。