面试题答案
一键面试可能出现的内存安全问题
- 竞态条件(Race Condition):多个goroutine同时读写共享内存数据,导致最终结果取决于这些操作的执行顺序,产生不确定的结果。
使用Go语言特性避免问题的方法
- 互斥锁(Mutex):使用
sync.Mutex
来保护共享资源,在访问共享数据前加锁,访问结束后解锁,保证同一时间只有一个goroutine能访问共享数据。 - 读写锁(RWMutex):当读操作远多于写操作时,使用
sync.RWMutex
。读操作可以并发进行,但写操作需要独占访问,以避免数据不一致。
示例代码
package main
import (
"fmt"
"sync"
)
var (
count int
mu sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
count++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final count:", count)
}
在上述代码中,mu
是一个互斥锁,increment
函数在对count
进行操作前加锁,操作完成后解锁,确保了多goroutine环境下count
的安全访问。