golang读锁有什么用


本文摘自php中文网,作者(*-*)浩,侵删。

是因为多个goroutine对同一个map产出了竞争,解决这个问题的方法有两个,一个是用sync.Map,另一个是加锁。sync.map是go1.9新加的特性,这里暂且先不讨论。而且当前业务场景用读写锁完全可以解决,所以决定使用读写锁。

读写锁

RWMutex是一个读写锁,该锁可以加多个读锁或者一个写锁,其经常用于读次数远远多于写次数的场景。 (推荐学习:go)

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

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

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

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

概括:

读锁不能阻塞读锁

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

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

写锁需要阻塞写锁

上代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

type MapWithLock struct {  //把读写锁和资源map封装在一起

    sync.RWMutex

    M map[string]Kline

}

 

var KlineDataMemory = make(map[string] interface{})

    var InstrLock sync.RWMutex

    var counter = MapWithLock{    // 生成一个带有锁和map的实例,然后就可以使用啦

        InstrLock,

        KlineDataMemory,

    }

 

    .

    .

    .

 

    counter.RLock()      //加读锁

        for _, v := range counter.M {

            instrID = v.InstrumentID

            break

        }

    counter.RUnlock()   //解除读锁    加锁和解锁必须成对出现,并且建议放在同一层次的代码块中

以上就是golang读锁有什么用的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang 主要做什么

基于apple m1 golang的debug模式

golang怎么编写一个window定时关机

golang怎么判断slice是否为空

windows下如何玩转火热的go-zero

golang array slice操作示例 去重 插入 删除 清空

golang反射为什么慢

使用gin封装一个web脚手架(五):实现session(上)

golang xorm mysql代码生成器(java,go)

go 时间格式化 字符串格式化为时间格式

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




打赏

取消

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

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

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

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

评论

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

    暂无评论...