面试题答案
一键面试- 控制读锁粒度的思路:
- 在Go语言中,
RWMutex
提供了读锁(RLock
)和写锁(Lock
)。对于读多写少的场景,尽量让读操作并行执行可以提高并发性能。可以通过在合适的代码块内使用读锁,尽量缩短读锁的持有时间,避免读锁长时间占用而影响写操作。
- 在Go语言中,
- 代码实现示例:
package main
import (
"fmt"
"sync"
)
// 定义一个数据结构
type Data struct {
mu sync.RWMutex
value int
}
// 读操作函数
func (d *Data) Read(wg *sync.WaitGroup) {
defer wg.Done()
d.mu.RLock()
defer d.mu.RUnlock()
fmt.Printf("Read value: %d\n", d.value)
}
// 写操作函数
func (d *Data) Write(wg *sync.WaitGroup, v int) {
defer wg.Done()
d.mu.Lock()
defer d.mu.Unlock()
d.value = v
fmt.Printf("Write value: %d\n", d.value)
}
可以通过如下方式调用这些函数来演示读多写少场景下的锁使用:
func main() {
var wg sync.WaitGroup
data := Data{}
// 模拟多个读操作
for i := 0; i < 5; i++ {
wg.Add(1)
go data.Read(&wg)
}
// 模拟一个写操作
wg.Add(1)
go data.Write(&wg, 10)
wg.Wait()
}
在上述代码中,读操作使用 RLock
获取读锁,这样多个读操作可以并行执行。写操作使用 Lock
获取写锁,写锁会阻止其他读操作和写操作,以保证数据一致性。通过控制读锁的粒度,只在读取数据的关键代码块内持有读锁,提高了读多写少场景下的并发性能。