zoukankan      html  css  js  c++  java
  • golang读写锁RWMutex

    读写锁是针对读写的互斥锁

    基本遵循两大原则:

    1、可以随便读,多个goroutine同时读

    2、写的时候,啥也不能干。不能读也不能写

    RWMutex提供了四个方法:

    func (*RWMutex) Lock // 写锁定

    func (*RWMutex) Unlock // 写解锁

    func (*RWMutex) RLock // 读锁定

    func (*RWMutex) RUnlock // 读解锁

    一、随便读

    package main
    
    import (
        "sync"
        "time"
    )
    
    var m *sync.RWMutex
    
    func main() {
        m = new(sync.RWMutex)
        
        // 多个同时读
        go read(1)
        go read(2)
    
        time.Sleep(2*time.Second)
    }
    
    func read(i int) {
        println(i,"read start")
    
        m.RLock()
        println(i,"reading")
        time.Sleep(1*time.Second)
        m.RUnlock()    
    
        println(i,"read over")
    }

    运行结果:

    1 read start

    1 reading 

    2 read start

    2 reading

    1 read over

    2 read over

    可以看出1 读还没有结束,2已经在读

    二、写的时候啥也不能干

    package main
    
    import (
        "sync"
        "time"
    )
    
    var m *sync.RWMutex
    
    func main() {
        m = new(sync.RWMutex)
        
        // 写的时候啥也不能干
        go write(1)
        go read(2)
        go write(3)
    
        time.Sleep(2*time.Second)
    }
    
    func read(i int) {
        println(i,"read start")
    
        m.RLock()
        println(i,"reading")
        time.Sleep(1*time.Second)
        m.RUnlock()    
    
        println(i,"read over")
    }
    
    func write(i int) {
        println(i,"write start")
    
        m.Lock()
        println(i,"writing")
        time.Sleep(1*time.Second)
        m.Unlock()
    
        println(i,"write over")
    }

    输出:

    1 write start

    1 writing

    2 read start

    3 write start

    1 writing over

    2 reading

    2 read over

    3 writing

    3 write over

  • 相关阅读:
    管理者的主要任务是什么?
    管理者的最基本职责是什么?
    管理者的两大职责:“管事”和“理人”
    最近的思考
    刨根问底Objective-C Runtime
    Objective-C 中的类和对象
    ios动态添加属性的几种方法
    多态 oc c++ 与oc category
    利用Objective-C运行时hook函数的三种方法
    Hook技术
  • 原文地址:https://www.cnblogs.com/ExMan/p/15246140.html
Copyright © 2011-2022 走看看