面试题答案
一键面试- 读写锁优化原理:
- 读写锁(
sync.RWMutex
)允许有多个读操作同时进行,因为读操作不会改变共享数据结构的状态,不会产生数据竞争。 - 当有写操作时,为了保证数据的一致性,需要独占访问共享数据结构,此时不能有读操作同时进行。
- 读写锁(
- 代码示例:
package main
import (
"fmt"
"sync"
)
// 定义共享数据结构
type Data struct {
value int
mu sync.RWMutex
}
// 读操作
func (d *Data) Read() int {
d.mu.RLock()
defer d.mu.RUnlock()
return d.value
}
// 写操作
func (d *Data) Write(newValue int) {
d.mu.Lock()
defer d.mu.Unlock()
d.value = newValue
}
在上述代码中:
Read
方法用于读操作,通过d.mu.RLock()
获取读锁,这样多个Goroutine可以同时调用Read
方法读取数据。在方法结束时,通过defer d.mu.RUnlock()
释放读锁。Write
方法用于写操作,通过d.mu.Lock()
获取写锁,这会阻止其他读操作和写操作同时进行,保证数据一致性。在方法结束时,通过defer d.mu.Unlock()
释放写锁。
下面是测试读写操作的示例:
func main() {
var wg sync.WaitGroup
data := Data{}
// 启动多个读操作
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("Read value:", data.Read())
}()
}
// 启动写操作
wg.Add(1)
go func() {
defer wg.Done()
data.Write(42)
fmt.Println("Write value: 42")
}()
wg.Wait()
}
在 main
函数中,启动了多个读操作Goroutine和一个写操作Goroutine,通过读写锁保证了并发操作的正确性和性能优化。