Go语言开发读写锁学习 老男孩周末班培训go

    /    2019-06-06

RWMutex是一个读写锁,该锁可以加多个读锁或者一个写锁,其经常用于读次数远远多于写次数的场景。

func (rw *RWMutex) Lock()

Lock方法将rw锁定为写入状态,禁止其他线程读取或者写入。如果在添加写锁之前已经有其他的读锁和写锁,则lock就会阻塞直到该锁可用,为确保该锁最终可用,已阻塞的 Lock 调用会从获得的锁中排除新的读取器,即写锁权限高于读锁,有写锁时优先进行写锁定。

func (rw *RWMutex) Unlock()

Unlock方法解除rw的写入锁状态,如果m未加写入锁会导致运行时错误。

func (rw *RWMutex) RLock()

RLock方法将rw锁定为读取状态,禁止其他线程写入,但不禁止读取。

func (rw *RWMutex) RUnlock()

Runlock方法解除rw的读取锁状态,如果m未加读取锁会导致运行时错误。

读写锁的写锁只能锁定一次,解锁前不能多次锁定,读锁可以多次,但读解锁次数最多只能比读锁次数多一次,一般情况下我们不建议读解锁次数多余读锁

读写锁应用 

读多写少的情况,用读写锁, 协程同时在操作读。

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

var rwLock sync.RWMutex

func main() {
    m := make(map[int]int5)
    m[1] = 10
    m[2] = 10
    m[3] = 10
    m[4] = 10
    m[5] = 10
    for i := 0; i < 2; i++ {
        go func() {
            rwLock.Lock()
            m[5] = rand.Intn(100)
            rwLock.Unlock()
        }()
    }
    for i := 0; i < 10; i++ {
        go func() {
            rwLock.RLock()
            fmt.Println(m)
            rwLock.RUnlock()
        }()
    }
    time.Sleep(time.Second * 2)
}

当RUnlock()在RLock()之前使用时便会报错,实例如下:

package main

import (
    "fmt"
    "sync"
)

func main() {
    RWLock := new(sync.RWMutex)
    RWLock.RUnlock()
    fmt.Println("hello RWMutex")
    RWLock.RLock()
}

运行错误:

fatal error: sync: RUnlock of unlocked RWMutex


更多内容请关注微信公众号:oldboygo

(0)

分享至