【发布时间】:2017-05-25 03:47:37
【问题描述】:
代码简单如下:
package main
import (
"fmt"
// "sync"
"time"
)
var count = uint64(0)
//var l sync.Mutex
func add() {
for {
// l.Lock()
// fmt.Println("Start ++")
count++
// l.Unlock()
}
}
func main() {
go add()
time.Sleep(1 * time.Second)
fmt.Println("Count =", count)
}
案例:
- 在不改变的情况下运行代码,您将得到“Count = 0”。没想到??
- 仅取消注释第 16 行 "fmt.Println("Start ++")";你会得到很多“Start ++”的输出和一些像“Count = 11111”这样的计数值。预期??
- 仅取消注释第 11 行“var l sync.Mutex”、第 15 行“l.Lock()”和第 18 行“l.Unlock()”并保留第 16 行的注释;你会得到像“Count = 111111111”这样的输出。预计。
所以...我在共享变量中的使用有问题...?我的问题:
- 为什么案例 1 的计数为 0?
- 如果情况 1 是预期的,为什么会发生情况 2?
环境: 1.go版本go1.8 linux/amd64 2. 3.10.0-123.el7.x86_64 3. CentOS Linux release 7.0.1406 (Core)
【问题讨论】:
-
似乎工作:(https)goo.gl/Fa2JUC
-
@VonC:您没有检查数据竞争:警告:数据竞争。