面试题答案
一键面试读锁状态转换
- 空闲状态:RWMutex 初始化后,读锁处于空闲状态,此时没有任何 goroutine 持有读锁或写锁。
- 获取状态:当一个或多个 goroutine 调用
RLock()
方法时,读锁被获取。只要没有写锁被持有,读锁可以被多个 goroutine 同时获取。此时读锁计数增加,每调用一次RLock()
,读锁计数加1。
写锁状态转换
- 空闲状态:RWMutex 初始化后,写锁处于空闲状态,此时没有任何 goroutine 持有读锁或写锁。
- 获取状态:当一个 goroutine 调用
Lock()
方法时,写锁被获取。写锁获取时会阻塞所有试图获取读锁或写锁的其他 goroutine。如果此时有读锁被持有,写锁会等待所有读锁释放后才会获取成功。 - 释放状态:当持有写锁的 goroutine 调用
Unlock()
方法时,写锁被释放。写锁释放后,处于等待状态的读锁或写锁可以竞争获取锁。如果有读锁等待,读锁会被获取;如果有写锁等待,写锁会被获取。