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")
}

執行結果:
這裏寫圖片描述
這裏寫圖片描述

什麼也不說了,如想更加深刻理解,請複製上面代碼自己運行看看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章