Go 如何排查数据竞争问题?

概念

只要有两个以上的goroutine并发访问同一变量,且至少其中的一个是写操作的时候就会发生数据竞争;全是读的情况下是不存在数据竞争的。

排查方式

  1. package main
  2. import "fmt"
  3. func main() {
  4. i := 0
  5. go func() {
  6. i++ // write i
  7. }()
  8. fmt.Println(i) // read i
  9. }

go命令行有个参数race可以帮助检测代码中的数据竞争

  1. $ go run -race main.go
  2. WARNING: DATA RACE
  3. Write at 0x00c0000ba008 by goroutine 7:
  4. exit status 66