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