面试题答案
一键面试- 思路:
- 使用goroutine实现并发:利用Go语言的goroutine来并发执行读取和更新操作,以充分利用多核CPU资源,提高性能。
- 使用互斥锁(Mutex)避免资源竞争:当多个goroutine需要访问共享资源时,通过
sync.Mutex
来保证同一时间只有一个goroutine可以访问共享资源,从而避免资源竞争。 - 读写锁(RWMutex)优化读操作:由于读取操作频繁,可以使用
sync.RWMutex
,允许多个读操作同时进行,而写操作时则独占资源,这样在读多写少的场景下能进一步提高性能。
- 关键代码片段:
package main
import (
"fmt"
"sync"
)
// 定义共享资源
var sharedResource int
// 定义读写锁
var rwMutex sync.RWMutex
// 读操作函数
func readResource(wg *sync.WaitGroup) {
defer wg.Done()
// 读锁,允许多个读操作同时进行
rwMutex.RLock()
defer rwMutex.RUnlock()
fmt.Printf("Read resource: %d\n", sharedResource)
}
// 写操作函数
func writeResource(wg *sync.WaitGroup, value int) {
defer wg.Done()
// 写锁,独占资源
rwMutex.Lock()
defer rwMutex.Unlock()
sharedResource = value
fmt.Printf("Write resource: %d\n", sharedResource)
}
func main() {
var wg sync.WaitGroup
// 模拟多个读操作
for i := 0; i < 5; i++ {
wg.Add(1)
go readResource(&wg)
}
// 模拟多个写操作
for i := 0; i < 3; i++ {
wg.Add(1)
go writeResource(&wg, i*10)
}
wg.Wait()
}
在上述代码中:
sharedResource
是共享资源。rwMutex
是sync.RWMutex
类型的读写锁。readResource
函数使用读锁RLock
来读取共享资源,允许多个读操作并发执行。writeResource
函数使用写锁Lock
来更新共享资源,保证写操作的原子性,避免资源竞争。- 在
main
函数中,通过WaitGroup
来等待所有goroutine执行完毕,模拟了多个读操作和写操作的并发执行场景。