在前面的文章里面,我们介绍了go语言的多线程编程,并且熟悉了waitgroup和channel,这篇文章,我们在多线程的基础上再来介绍下这个锁相关的操作,这里首先介绍第一种互斥锁。
这里的互斥锁其实就是go语言里面的Sync.Mutex类,在需要加锁的地方进行lock即可,在需要解锁的地方进行unlock即可。这里有点像java语言里面的ReentrantLock。下面我们直接用一个set-get方法案例来试试:
package main
import (
"sync"
"time"
)
var (
m sync.Mutex
v1 int
)
func Set(i int) {
m.Lock()
time.Sleep(time.Second)
v1 = i
m.Unlock()
}
func Get() int {
m.Lock()
a := v1
m.Unlock()
return a
}
func main() {
num := 5
var wg sync.WaitGroup
println("初始值是:%d", Get())
for i := 0; i < num; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
Set(i)
println("现在的结果是:%d", Get())
}(i)
}
wg.Wait()
}在这个代码里面,我们使用多线程来操作这里的v1值,并且同时进行了set和get,我们在set和get里面分别进行了lock和unlock,运行下看看效果:
可以看到是成功的被锁住的。
备注:
1、使用这里mutex的话,记得加锁和解锁必须是成对出现的,不能只有开锁,没有解锁,也不能没有开锁,只有解锁,两者缺一不可。
2、这里的加锁需要我们手动的进行操作。
3、在解锁的时候,我们可以使用defer关键词,这样子可以避免忘记掉解锁。
4、Sync.Mutex锁只能加锁一次,如果还要再次加锁就必须要等待开锁之后再进行加锁。


还没有评论,来说两句吧...