• 技术文章 >后端开发 >Golang

    golang读锁有什么用

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

    php入门到就业线上直播课:进入学习

    读写锁

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

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

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

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

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

    概括:

    读锁不能阻塞读锁

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

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

    写锁需要阻塞写锁

    上代码:

    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读锁有什么用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:golang
    上一篇:golang的优势是什么 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • PHP与Golang通信• 详细介绍golang中的log模块• Golang互斥锁内部实现的实例详解• 详细介绍golang中defer的关键特性
    1/1

    PHP中文网