互斥锁
package main
import (
"fmt"
"sync"
)
// 多个协程操作同一个变量时,会发生竞争关系,需要一个互斥锁,否则运行程序时可能会报错
var wg sync.WaitGroup
var mutex sync.Mutex // 声明互斥锁
// 还有一种读写互斥锁,sync.RWMutex 使用mutex.RLock()和mutex.RUnlock()表示可以进行并发操作但对于普通互斥锁还是互斥的
var count int = 0
func test() {
mutex.Lock() // 当一个协程运行到此处时即上锁,其他协程无法访问
count++ // 此处可能会有多个协程同时操作count变量引发错误
fmt.Println(count)
mutex.Unlock() // 一个协程执行完毕,释放互斥锁
wg.Done() // 协程数-1
}
func main() {
// 开启20个协程进行test函数操作
for i := 0; i < 50; i++ {
wg.Add(1) // 协程数+1
go test()
}
wg.Wait() // 程序等待所有协程完毕后才会退出程序
}