和以前一样,不能保证在 main 中,察看对 done 的写入意味着察看对 a 的写入,因此该顺序也可以打印一个空字符串。 更蹩脚的状况下,由于两个线程之间没有同步事情,因此无法保证 main 会察看到对 done 的写入。 main 中的循环会不断死循环。
下面是该例子的一个更巧妙的变体
type T struct {
msg string
}
var g *T
func setup() {
t := new(T)
t.msg = "hello, world"
g = t
}
func main() {
go setup()
for g == nil {
}
print(g.msg)
}
虽然 main 观测到g不为nil,但是也没有任何机制保证可以读取到t.msg。
在上述例子中,处置方案都是相反的:请运用显式的同步机制。
【编辑引荐】
Vue 2 系统如何快速迁移 Vite 作为开发工具
开发中的坑2:MQ 也能做 RPC 调用?
混合云和多云架构的五个支持技术
真实环境下大内存 Go 效劳功用优化一例
AI续写小说悄然盛行:人类特有的创作力,曾经被AI复制?_IT技术周刊第681期
(责任编辑:admin)