go - 执行闭包 goroutine 未能达到预期结果
问题描述
func main() {
var number int = 0
go func() {
for {
number++
//time.Sleep(time.Nanosecond)
}
}()
for {
fmt.Println(number)
time.Sleep(time.Second)
}
}
number的打印总是0,但是在for循环中加上time.Sleep(time.Nanosecond)语句后,value的打印就正常了。为什么?
解决方案
你有一个数据竞赛。阅读 Go 内存模型:
如果在 goroutine 之间没有使用通道或锁进行显式同步,那么就没有发生之前的关系,也不能保证一个 goroutine 会看到另一个 goroutine 的效果。如果您使用的是 Go v1.13 或更早版本,那么忙循环将不会屈服于其他 goroutine。
推荐阅读
- extract - 使用 GDAL 命令如何从栅格中提取值为 10、20、30 和 40 的像元?
- javascript - 哪个节省更多内存,对象初始化器或数组?
- vue.js - 如何更改 Vue Material 中的 HTML5 “md-” 前缀?
- parse-platform - 在 Parse 平台上使用 createdAt 和 updatedAt 发布新记录
- java - 如何使用名称检索 java 线程?
- python - 如何检查字符串中的数字?
- vb.net - 如何在定期定时的 VB.NET Windows 服务中计算 VB6 exe 的处理时间?
- angular - 如何更改角度 Ag 网格列的标题名称
- python - 声明 Flask 蓝图时查询
- kubernetes - Kubenetes & windows 容器 & msbuild 性能