由于同时用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锁机制或者通道阻塞机制实现临界区的访问