利用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()
结果: