Shadow
golang里的互斥锁使用
11/28
golang里的互斥锁使用
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var lock sync.Mutex
var run int = 0
func main() {
//未加锁,造成读写混乱
//wg.Add(3)
//go addNum()
//go addNum()
//go addNum()
//wg.Wait()
//fmt.Println(run) //这里不是我们预期的结果3000,随机的
//加上互斥锁,解决读写混乱;将并发变成了串行,牺牲效率,保证数据安全性。
wg.Add(3)
go addRun("a1")
go addRun("a2")
go addRun("a3")
wg.Wait()
fmt.Println(run) //4500
}
//这个函数如果同时并发一起调用,结果会存在数据竞争,导致最后的结果与期待的不符
func addNum() {
for i := 0; i < 1000; i++ {
run++
}
wg.Done()
}
//使用 sync.Mutex 使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,多个goroutine同时等待一个锁时,唤醒的策略是随机的。
func addRun(typeName string) {
fmt.Println(typeName)
lock.Lock() //加锁
for i := 0; i < 1500; i++ {
run++
}
lock.Unlock() //释放
wg.Done()
}
版权属于:
Dcr163的博客
本文链接:
https://dcr163.cn/592.html(转载时请注明本文出处及文章链接)