在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
语句来确保在函数返回时释放锁,避免忘记释放锁导致死锁的问题。