本文摘自网络,作者,侵删。
golang互斥锁 sync.Mutex
先看一段代码
package main
import (
"fmt"
"sync"
)
var x int
var wg sync.WaitGroup
func f1() {
for i := 0; i < 20000; i++ {
x++
}
wg.Done()
}
func main() {
wg.Add(2)
go f1()
go f1()
wg.Wait()
fmt.Println(x)
}
E:\go\src\learngolang\00test>00test.exe
38289
E:\go\src\learngolang\00test>00test.exe
39420
E:\go\src\learngolang\00test>00test.exe
37269
我们执行几次看到其实返回的x值是不固定的,因为,两个goroutine并行执行,都会对x的值做出读写操作,导致了换乱。这时我们可以对x加一个互斥锁,保证同时只有一个goroutine可以访问 共享变量(临界区)。
var mutex sync.Mutex
修改一下 f1()
func f1() {
for i := 0; i < 20000; i++ {
mutex.Lock() // 所在goroutine获得互斥锁之后,会阻塞其他goroutine对临界区的访问
x++ // Lock与Unlock直接的代码段叫临界区,惯例来说,被保护的变量应该再Lock()之后立即声明
mutex.Unlock() // goroutine在结束后释放锁是必要的,无论以哪条路径通过函数都需要释放,即使是在错误路径中,也要记得释放。
}
wg.Done()
}
再执行几下看看
E:\go\src\learngolang\00test>go build
E:\go\src\learngolang\00test>00test.exe
40000
E:\go\src\learngolang\00test>00test.exe
40000
E:\go\src\learngolang\00test>00test.exe
40000
本文来自:简书
感谢作者:阿斯顿法
查看原文:golang互斥锁 sync.Mutex
相关阅读 >>
通过 wasmedge 嵌入webassembly 函数扩展 Golang 应用
【Golana语言社区】window应该开发之--cmd杀进程
聊聊dubbo-Go-proxy的discoveryservice
更多相关阅读请进入《Go》频道 >>
Go语言101
一个与时俱进的Go编程知识库。