使用Mutex互斥锁,加锁可以保证资源不被其他协程修改
package main
import (
"fmt"
"sync"
)
var m int = 100
var lock sync.Mutex
var wt sync.WaitGroup
func add() {
defer wt.Done()
lock.Lock() //加锁后可实现资源如m,不被其他协程操作
m += 1
fmt.Printf("m++: %v\n", m)
lock.Unlock()
}
func sub() {
defer wt.Done()
lock.Lock()
m -= 1
fmt.Printf("m--: %v\n", m)
lock.Unlock()
}
func main() {
for i := 0; i < 100; i++ {
wt.Add(1)
go add()
wt.Add(1)
go sub()
}
wt.Wait() //保证其他协程先完成
fmt.Printf("m: %v\n", m)
}
加Mutex之前,m的值不一定等于100,加锁后值等于100
atomic操作
package main
import (
"fmt"
"sync/atomic"
"time"
)
var i int32 = 100
func add() {
atomic.AddInt32(&i, 1)
}
func sub() {
atomic.AddInt32(&i, -1)
}
func main() {
for i := 0; i < 100; i++ {
go add()
go sub()
}
time.Sleep(time.Second * 3)
fmt.Printf("i: %v\n", i)
}
运行结果
i: 100