首页 > 解决方案 > 执行闭包 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的打印就正常了。为什么?

标签: gogoroutine

解决方案


你有一个数据竞赛。阅读 Go 内存模型:

https://golang.org/ref/mem

如果在 goroutine 之间没有使用通道或锁进行显式同步,那么就没有发生之前的关系,也不能保证一个 goroutine 会看到另一个 goroutine 的效果。如果您使用的是 Go v1.13 或更早版本,那么忙循环将不会屈服于其他 goroutine。


推荐阅读