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