var wg sync.WaitGroup
var total =0funcadd(){defer wg.Done()for i :=0; i <10000; i++{
total++}}funcsub(){defer wg.Done()for i :=0; i <10000; i++{
total--}}funcmain(){
wg.Add(2)goadd()gosub()
wg.Wait()
fmt.Println(total)}// 输出: -9902 (其实是随机变化的,无法预测的)
mux
适合相对复杂场景下的加锁,如结构体等
var wg sync.WaitGroup
var lock sync.Mutex
var total =0funcadd(){defer wg.Done()for i :=0; i <10000; i++{
lock.Lock()
total++
lock.Unlock()}}funcsub(){defer wg.Done()for i :=0; i <10000; i++{
lock.Lock()
total--
lock.Unlock()}}funcmain(){
wg.Add(2)goadd()gosub()
wg.Wait()
fmt.Println(total)}
atomic
性能更高, 适合相对简单的加锁, 如单个变量进行加锁的场景,
本示例中相当于把add()方法的操作,当做一个原子操作来执行
var wg sync.WaitGroup
var total int32funcadd(){defer wg.Done()for i :=0; i <10000; i++{
atomic.AddInt32(&total,1)}}funcsub(){defer wg.Done()for i :=0; i <10000; i++{
atomic.AddInt32(&total,-1)}}funcmain(){
wg.Add(2)goadd()gosub()
wg.Wait()
fmt.Println(total)}