互斥锁
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() // 程序等待所有协程完毕后才会退出程序
}
本文介绍了一个使用Go语言实现的互斥锁案例。通过一个简单的计数器程序演示了如何利用互斥锁(mutex)来避免多协程并发修改共享变量导致的数据不一致问题。程序中定义了一个名为count的整型变量,并通过mutex.Lock()和mutex.Unlock()确保了在增加count变量值的过程中不会出现竞态条件。

被折叠的 条评论
为什么被折叠?



