Go race检测:数据竞争排查
学习使用Go内置的竞态检测器(race detector)识别和修复并发程序中的数据竞争问题。 · 难度:入门 · +15XP
数据竞争与race检测
数据竞争发生在多个goroutine同时访问同一变量,且至少有一个是写操作时。Go的race检测器通过-race标志在运行时检测这些情况。
启用检测
go run -race main.go
go test -race ./...典型示例
var counter int
func main() {
for i := 0; i < 1000; i++ {
go func() {
counter++ // 数据竞争
}()
}
}
修复方法
| 方法 | 示例 |
|---|---|
| 使用Mutex | mu.Lock(); counter++; mu.Unlock() |
| 使用原子操作 | atomic.AddInt64(&counter, 1) |
| 使用channel | 通过channel传递值 |
检测器输出
当检测到竞争时,会打印goroutine栈追踪和变量地址,帮助定位问题。
练习提示
运行以下代码时加上-race标志,观察检测器输出。然后用Mutex修复它。