锁的使用场景主要涉及到哪些?读写锁为什么会比普通锁快【Golang 入门系列十六】


当前第2页 返回上一页

 

需要注意的问题:

  1. 不要重复锁定互斥锁
  2. 不要忘记解锁互斥锁,必要时使用 defer 语句
  3. 不要在多个函数之间直接传递互斥锁

 

四、如何使用读写锁

读写锁的场景主要是在多线程的安全操作下,并且读的情况多于写的情况,也就是说既满足多线程操作的安全性,也要确保性能不能太差,这时候,我们可以考虑使用读写锁。当然你也可以简单暴力直接使用互斥锁(Mutex)。

Lock() 写锁,如果在添加写锁之前已经有其他的读锁和写锁,则lock就会阻塞直到该锁可用,为确保该锁最终可用,已阻塞的 Lock 调用会从获得的锁中排除新的读取器,即写锁权限高于读锁,有写锁时优先进行写锁定。

Unlock() 写锁解锁,如果没有进行写锁定,则就会引起一个运行时错误。

RLock() 读锁,当有写锁时,无法加载读锁,当只有读锁或者没有锁时,可以加载读锁,读锁可以加载多个,所以适用于"读多写少"的场景。

RUnlock() 读锁解锁,RUnlock 撤销单次RLock 调用,它对于其它同时存在的读取器则没有效果。若 rw 并没有为读取而锁定,调用 RUnlock 就会引发一个运行时错误。

package mainimport ("fmt"    "sync")
var (    count int    rwLock sync.RWMutex)
func main() {    for i := 0; i < 2; i++ {        go func() {            for i := 1000000; i > 0; i-- {                rwLock.Lock()                count ++                rwLock.Unlock()            }            fmt.Println(count)        }()    }
   fmt.Scanf("\n") //等待子线程全部结束}
运行结果:19686372000000

看着挺复杂的,其实简单来说就是:

  1. 读锁不能阻塞读锁

  2. 读锁需要阻塞写锁,直到所有读锁都释放

  3. 写锁需要阻塞读锁,直到所有写锁都释放

  4. 写锁需要阻塞写锁

 

五、最后

以上,就把golang中各种锁的使用场景及怎么使用互斥锁和读写锁等相关内容介绍完了,希望能对大家有所帮助。



本文来自:51CTO博客

感谢作者:mb5fe94b3e552d9

查看原文:锁的使用场景主要涉及到哪些?读写锁为什么会比普通锁快【Golang 入门系列十六】

返回前面的内容

相关阅读 >>

Golang单向链表

手撸Golang etcd raft协议之8

将 5 万行 java 代码移植到 Go 学到的经验

总结 Go 的数据类型

Golang中的闭包

Go语言适合做哪些开发

手撸Golang 创建型设计模式 原型模式

手撸Golang 创建型设计模式 建造者模式

Golang 开发

聊聊cortex的distributor

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...