利用mutex锁,我们可以保证每个瞬间只有一个协程在访问x

package main

import (
	"fmt"
	"sync"
)

var x = 0 //全局变量

func increment(wg *sync.WaitGroup, m *sync.Mutex) {
	m.Lock()
	x = x + 1 //锁定后访问全局变量
	m.Unlock()
	wg.Done()
}
func main() {
	var w sync.WaitGroup
	var m sync.Mutex //声明一个互斥锁
	for i := 0; i < 10000; i++ {
		w.Add(1)
		go increment(&w, &m)
	}
	w.Wait()
	fmt.Println("final value of x", x) //结果确定
}

分析:
1.锁的申明创建:var m sync.Mutex
2.传参:和WaitGroup一样都要用&和*
3.临界区前后使用Lock()和Unlock()

结果:
在这里插入图片描述