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