面试题答案
一键面试RWMutex锁实现读写操作同步原理
- 读操作
- 多个读操作可以同时进行。
RWMutex
内部使用一个计数器来记录当前正在进行的读操作数量。当一个读操作请求锁时,如果没有写操作正在进行(即写锁未被锁定),则该读操作可以立即获取读锁,计数器加1。读操作结束时,计数器减1。
- 多个读操作可以同时进行。
- 写操作
- 写操作是独占的。当一个写操作请求锁时,如果当前有读操作正在进行(读锁计数器不为0)或者已经有写操作持有写锁,写操作会被阻塞,直到所有读操作完成并且写锁可用。一旦写操作获取到写锁,其他读操作和写操作都将被阻塞,直到写操作释放写锁。
读多写少场景下合理使用RWMutex锁优化高并发性能
- 读操作使用读锁
- 在处理读操作的函数中,使用
RLock
方法获取读锁。例如:
- 在处理读操作的函数中,使用
var mu sync.RWMutex
var data int
func readData() int {
mu.RLock()
defer mu.RUnlock()
return data
}
- 这样多个读操作可以并行执行,提高读取效率。
2. 写操作使用写锁
- 在处理写操作的函数中,使用 Lock
方法获取写锁。例如:
func writeData(newData int) {
mu.Lock()
defer mu.Unlock()
data = newData
}
- 写操作期间会阻止其他读写操作,以保证数据一致性。
3. 尽量缩短写锁持有时间 - 写操作应尽快完成,避免长时间持有写锁,减少对读操作的影响。例如,将复杂的数据处理尽量放在获取写锁之前完成,只在更新数据时持有写锁。 4. 批量操作 - 如果有多个写操作,可以考虑批量执行,减少写锁获取和释放的频率。例如,先收集多个写操作的数据,然后一次性获取写锁进行处理。