在Go語言中,可以使用sync
包中的Mutex
或RWMutex
來實現多線程之間共享變量的訪問控制。
Mutex
是一種互斥鎖,可以使用Lock
和Unlock
方法來控制對共享變量的讀寫訪問。在使用Lock
方法之前,需要先獲取鎖,然后再使用Unlock
方法來釋放鎖。
import (
"sync"
)
var (
mu sync.Mutex
count int
)
func main() {
go increment()
go increment()
// 等待所有goroutine執行完成
time.Sleep(time.Second)
fmt.Println("count:", count)
}
func increment() {
for i := 0; i < 100000; i++ {
mu.Lock()
count++
mu.Unlock()
}
}
RWMutex
是一種讀寫鎖,支持多個goroutine同時讀取共享變量,但只能有一個goroutine進行寫操作。可以使用RLock
和RUnlock
方法來獲取和釋放讀鎖,使用Lock
和Unlock
方法來獲取和釋放寫鎖。
import (
"sync"
)
var (
mu sync.RWMutex
count int
)
func main() {
go read()
go read()
go write()
// 等待所有goroutine執行完成
time.Sleep(time.Second)
fmt.Println("count:", count)
}
func read() {
for i := 0; i < 100000; i++ {
mu.RLock()
_ = count
mu.RUnlock()
}
}
func write() {
for i := 0; i < 100000; i++ {
mu.Lock()
count++
mu.Unlock()
}
}
在使用sync.Mutex
或sync.RWMutex
時,需要注意以下幾點:
Lock
或RLock
方法獲取鎖時,如果鎖已經被其他goroutine占用,則當前goroutine會阻塞等待鎖釋放。defer
語句來確保在函數返回時釋放鎖,避免忘記釋放鎖導致死鎖的問題。