代码如下:
m := make(map[interface{}]interface{})
//read
for i := 0; i< 10000; i++ {
go func() {
for range m {
}
}()
}
//write
for i := 0; i< 10000; i++ {
go func() {
mTemp := make(map[interface{}]interface{})
m = mTemp
}()
}
Run Code Online (Sandbox Code Playgroud)
有10000个读goroutine访问m,另外10000个写goroutine为m分配一个新的map,安全吗?
您有 goroutines 读取m变量,并且 goroutines 写入m变量而无需显式同步。这是一场数据竞争,因此是未定义的行为。
在启用竞争检测器的情况下运行它:
$ go run -race play.go
==================
WARNING: DATA RACE
Write at 0x00c00008c000 by goroutine 15:
main.main.func2()
/home/icza/gows/src/play/play.go:17 +0x46
Previous read at 0x00c00008c000 by goroutine 5:
main.main.func1()
/home/icza/gows/src/play/play.go:8 +0x45
Goroutine 15 (running) created at:
main.main()
/home/icza/gows/src/play/play.go:15 +0xdd
Goroutine 5 (finished) created at:
main.main()
/home/icza/gows/src/play/play.go:7 +0xa4
==================
Found 1 data race(s)
exit status 66
Run Code Online (Sandbox Code Playgroud)
查看相关问题:
还有一个通过故意数据竞争破坏 Go 内存安全的示例:Golang data races to Break memory safety