面试题答案
一键面试- 优化思路:
- 使用读写锁(
sync.RWMutex
)代替普通的互斥锁(Mutex
)。sync.RWMutex
允许并发读操作,只有在写操作时才会独占资源,从而提高频繁读操作场景下的性能。写操作时,会阻止其他读和写操作,以保证数据一致性。
- 使用读写锁(
- 代码示例:
package main
import (
"fmt"
"sync"
)
// 定义一个共享资源结构体
type SharedResource struct {
data int
rwmu sync.RWMutex
}
// 读操作函数
func (sr *SharedResource) read() int {
sr.rwmu.RLock()
defer sr.rwmu.RUnlock()
return sr.data
}
// 写操作函数
func (sr *SharedResource) write(newData int) {
sr.rwmu.Lock()
defer sr.rwmu.Unlock()
sr.data = newData
}
func main() {
var wg sync.WaitGroup
shared := SharedResource{}
// 模拟多个读操作
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("Read:", shared.read())
}()
}
// 模拟偶尔的写操作
wg.Add(1)
go func() {
defer wg.Done()
shared.write(42)
fmt.Println("Write completed")
}()
wg.Wait()
}
在上述代码中:
SharedResource
结构体包含一个int
类型的共享数据data
和一个读写锁rwmu
。read
方法使用RLock
进行读锁定,允许多个读操作并发执行。write
方法使用Lock
进行写锁定,在写操作时会独占资源,阻止其他读和写操作。