由于同时用go拉起多个协程,可能会导致两个协程同时执行而丢失某些更新
package main
import (
"fmt"
"sync"
)
var x = 0 //全局变量
func increment(wg *sync.WaitGroup) {
x = x + 1 //访问全局变量
wg.Done()
fmt.Println(x)
}
func main() {
var w sync.WaitGroup
for i := 0; i < 10000; i++ {
w.Add(1)
go increment(&w)
if i == 9999 {
fmt.Println("i=9999")
}
}
w.Wait()
fmt.Println("final value of x", x) //结果不确定
}
分析:
1.利用waitgroup拉起10000个协程
2.它们都对x + 1
3.由于具有瞬时性,它们的操作可能完全重合导致最终结果不为10000
结果:
总结:
利用mutex锁机制或者通道阻塞机制实现临界区的访问