GO:缺乏同步
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() }
代码分析
**变量:**
**功能:**
**main() 中的并发:**
**潜在问题:**
**可能的结果**
由于缺乏同步,程序的输出是不确定的。以下是可能的情况:
0 0
或者
2 0
**主要观察**
数据竞争:在没有同步的情况下并发访问 a 和 b 会引入数据竞争。这会使程序的行为变得不确定且不可预测
**修复代码**
var a, b int var wg sync.WaitGroup func f() { a = 1 b = 2 wg.Done() } func g() { print(b) print(a) } func main() { wg.Add(1) go f() wg.Wait() g() }
var a, b int func f(done chan bool) { a = 1 b = 2 done <- true } func g() { print(b) print(a) } func main() { done := make(chan bool) go f(done) <-done g() }
这里,g() 等待直到 f() 通过 done 通道发送信号。