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 通道发送信号。