在前面的文章里面,我们介绍了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锁只能加锁一次,如果还要再次加锁就必须要等待开锁之后再进行加锁。
还没有评论,来说两句吧...