go sync包的读写锁RWMutex的使用

sync包的读写锁RWMutex的使用(sync.RWMutex)

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

RWMutex的使用主要事项

  • 1、读锁的时候无需等待读锁的结束
  • 2、读锁的时候要等待写锁的结束
  • 3、写锁的时候要等待读锁的结束
  • 4、写锁的时候要等待写锁的结束

RWMutex的四种操作方法

RLock() //读锁定
RUnlock() //读解锁

Lock() //写锁定
Unlock() //写解锁


废话少说直接上代码:

package main

import (
    "sync"
    "time"
)

var m *sync.RWMutex

func main() {
    m = new(sync.RWMutex)
    go write(1)
    go read(21)
    go write(3)
    go read(22)
    go write(4)
    go read(23)
    go write(5)
    go read(24)
    go write(6)
    go read(25)
    go write(7)

    time.Sleep(20 * time.Second)
}

func read(i int) {
    println(i, "read start")
    m.RLock()
    var p = 0
    var pr = "read"
    for {
        pr += "."
        if p == 10 {
            break
        }
        time.Sleep(350 * time.Millisecond)
        p++
        println(i, pr)

    }
    m.RUnlock()
    println(i, "read end")
}

func write(i int) {
    println(i, "write start")

    m.Lock()
    var p = 0
    var pr = "write"
    for {
        pr += "."
        if p == 10 {
            break
        }
        time.Sleep(350 * time.Millisecond)
        p++
        println(i, pr)

    }
    m.Unlock()
    println(i, "write end")
}

执行结果:
go sync包的读写锁RWMutex的使用_第1张图片
go sync包的读写锁RWMutex的使用_第2张图片

什么也不说了,如想更加深刻理解,请复制上面代码自己运行看看。

你可能感兴趣的:(golang学习)