go 语言并发 once 疑问?
在看官方的文档,文档里面有一段代码
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".
为什么这段代码可能会产生错误的结果。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当一个 goroutine 看到
done
为true
的时候,它与其它 goroutine 没有任何同步操作。但是,此时这个 goroutine 看到的
a
可能还依然是""
。在没有同步操作了,不同 goroutine “看”到的指令“执行”顺序可能是不一样的。它甚至可能看到不应该出现的指令执行的“中间结果”。