在看官方的文档,文档里面有一段代码
var a string
var done bool
func setup() {
a = "hello, world"
done = true
}
func doprint() {
if !done {
once.Do(setup)
}
print(a)
}
func twoprint() {
go doprint()
go doprint()
}
This version can (incorrectly) print an empty string instead of "hello, world".
为什么这段代码可能会产生错误的结果。
当一个 goroutine 看到
done
为true
的时候,它与其它 goroutine 没有任何同步操作。但是,此时这个 goroutine 看到的
a
可能还依然是""
。在没有同步操作了,不同 goroutine “看”到的指令“执行”顺序可能是不一样的。它甚至可能看到不应该出现的指令执行的“中间结果”。