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
有疑问加站长微信联系(非本文作者)