最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go讀寫鎖操作方法示例詳解

 更新時(shí)間:2022年07月05日 17:29:09   作者:LiberHome  
這篇文章主要為大家介紹了Go讀寫鎖方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

前面講到,在資源競(jìng)爭的時(shí)候可以使用互斥鎖,保證了資源訪問的唯一性,但也降低了性能,仔細(xì)分析一下場(chǎng)景,如果只是讀取數(shù)據(jù),無論多少個(gè)goroutine都是不會(huì)存在邏輯上的互斥操作的。

這里讀寫鎖?? RWMutex就應(yīng)運(yùn)而生了,RWMutex可以分別針對(duì)讀操作和寫操作進(jìn)行上鎖和解鎖。

RWMutex同一時(shí)刻允許多個(gè)讀操作進(jìn)行,但只允許一個(gè)寫操作進(jìn)行,同時(shí),在某一個(gè)寫操作進(jìn)行的時(shí)候,讀操作不可進(jìn)行。

讀寫鎖有很多方法

  • 方法一: RLock 這個(gè)方法是讀鎖,當(dāng)寫鎖存在的時(shí)候,無法加載讀鎖,只有當(dāng)不存在鎖,或者只有讀鎖的時(shí)候才能使用。讀鎖可以同時(shí)加載多個(gè),適用于多度寫少的場(chǎng)景。
  • 方法二: RUnlock 這個(gè)方法是讀解鎖,用來撤銷單次的讀鎖操作。
  • 方法三: Lock 這個(gè)方法是寫上鎖,如果在添加寫上鎖之前已經(jīng)有其他的讀鎖和寫鎖了,此時(shí),這個(gè)Lock會(huì)被阻塞,直到可以使用。
  • 方法四: Unlock 這個(gè)方法是寫解鎖,如果沒有綁定寫鎖就直接寫解鎖,會(huì)引發(fā)運(yùn)行時(shí)錯(cuò)誤。

讀操作

下面用實(shí)際的代碼做例子,看一下讀操作:

package main
import (
    "fmt"
    "sync"
    "time"
)
//新建一個(gè)鎖對(duì)象的指針,然后待會(huì)兒再指針中創(chuàng)建這個(gè)鎖的對(duì)象
var rwMutex *sync.RWMutex
//為了保證 子的goroutine先執(zhí)行,可以使用同步等待組wg,這里創(chuàng)建wg的指針類型
var wg *sync.WaitGroup
func main() {
    rwMutex = new(sync.RWMutex)
    wg = new(sync.WaitGroup)
    wg.Add(2)//這里記得+add
    //    在主函數(shù)中 啟動(dòng)2條goroutine
    go readData(1)
    go readData(2)
    wg.Wait()
    fmt.Println("main func end")
}
func readData(i int) {
    defer wg.Done()
    fmt.Println(i, "start locking!")
    //    給讀操作 上鎖
    rwMutex.RLock()
    //    讀數(shù)據(jù)
    fmt.Println(i, "Reading data")
    //  睡一下
    time.Sleep(1 * time.Second)
    //    讀解鎖
    rwMutex.RUnlock()
    //打印提示信息
    fmt.Println(i, "Read over")
}

代碼運(yùn)行結(jié)果如下:

2 start locking!
2 Reading data
1 start locking!
1 Reading data
2 Read over
1 Read over
main func end

從打印結(jié)果可知,第二條goroutine先上讀鎖,然后第二條開始讀取,然后第一條上讀鎖【從這里就可以看出,因?yàn)榈诙l的讀鎖還沒讀解鎖,第一條的讀鎖就上了,所以這里的讀鎖并不互斥】,之后第一條開始讀取,第二條讀解鎖,第一條讀解鎖。主goroutine結(jié)束。

寫操作

package main
import (
    "fmt"
    "sync"
    "time"
)
//新建一個(gè)鎖對(duì)象的指針,然后待會(huì)兒再指針中創(chuàng)建這個(gè)鎖的對(duì)象
var rwMutex *sync.RWMutex
//為了保證 子的goroutine先執(zhí)行,可以使用同步等待組wg,這里創(chuàng)建wg的指針類型
var wg *sync.WaitGroup
func main() {
    rwMutex = new(sync.RWMutex)
    wg = new(sync.WaitGroup)
    wg.Add(4)
    //    在主函數(shù)中 啟動(dòng)2條goroutine
    go readData(1)
    go readData(2)
    go writeData(3)
    go writeData(4)
    wg.Wait()
    fmt.Println("main func end")
}
func readData(i int) {
    defer wg.Done()
    fmt.Println(i, "start locking!")
    //    給讀操作 上鎖
    rwMutex.RLock()
    //    讀數(shù)據(jù)
    fmt.Println(i, "Reading data")
    //  睡一下
    time.Sleep(1 * time.Second)
    //    讀解鎖
    rwMutex.RUnlock()
    //打印提示信息
    fmt.Println(i, "Read over")
}
func writeData(i int) {
    defer wg.Done()
    fmt.Println(i, " Writing Start")
    //寫上鎖
    rwMutex.Lock()
    fmt.Println(i, "~~~ writing right now~~~")
    time.Sleep(1 * time.Second)
    rwMutex.Unlock()
    fmt.Println(i, "writing completed")
}

代碼運(yùn)行結(jié)果如下:

2 start locking!
2 Reading data
4  Writing Start
1 start locking!
3  Writing Start
2 Read over
4 ~~~ writing right now~~~
4 writing completed
1 Reading data
1 Read over
3 ~~~ writing right now~~~
3 writing completed
main func end

分析可知,只有在goroutine4結(jié)束寫之后goroutine3才拿到權(quán)限開始寫。

不過講真,到處都是lock 和 unlock,臨界區(qū)什么的,真的是臃腫又容易出問題。
go語言中多個(gè)協(xié)程想共享數(shù)據(jù)的時(shí)候,將會(huì)有更加優(yōu)雅的處理方式。

以上就是Go讀寫鎖方法示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go讀寫鎖方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Go語言編寫一個(gè)極簡版的容器Container

    使用Go語言編寫一個(gè)極簡版的容器Container

    Docker作為一種流行的容器化技術(shù),對(duì)于每一個(gè)程序開發(fā)者而言都具有重要性和必要性,因?yàn)槿萜骰嚓P(guān)技術(shù)的普及大大簡化了開發(fā)環(huán)境配置、更好的隔離性和更高的安全性,對(duì)于部署項(xiàng)目和團(tuán)隊(duì)協(xié)作而言也更加方便,本文將嘗試使用Go語言編寫一個(gè)極簡版的容器
    2023-10-10
  • Go語言中的變量和常量

    Go語言中的變量和常量

    這篇文章介紹了Go語言中的變量和常量,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • golang日志框架之logrus的安裝使用教程

    golang日志框架之logrus的安裝使用教程

    logrus是一個(gè)非常強(qiáng)大的日志框架,具有靈活的功能和易于使用的API,適合處理各種類型的日志需求,這篇文章主要介紹了golang日志框架之logrus的安裝使用,需要的朋友可以參考下
    2023-08-08
  • Go語言利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列

    Go語言利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了Go語言中heap的使用以及如何利用heap實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列的相關(guān)資料,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • 一文了解Go語言的并發(fā)特性

    一文了解Go語言的并發(fā)特性

    本文主要介紹了一文了解Go語言的并發(fā)特性,通過輕量級(jí)線程、通道及選擇語句,使得并發(fā)編程變得既簡單又高效,下面就來具體了解一下如何使用,感興趣的可以了解一下
    2024-02-02
  • Go語言使用HTTP包創(chuàng)建WEB服務(wù)器的方法

    Go語言使用HTTP包創(chuàng)建WEB服務(wù)器的方法

    這篇文章主要介紹了Go語言使用HTTP包創(chuàng)建WEB服務(wù)器的方法,結(jié)合實(shí)例形式分析了Go語言基于HTTP包創(chuàng)建WEB服務(wù)器客戶端與服務(wù)器端的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-07-07
  • Golang?Gin?中間件?Next()方法示例詳解

    Golang?Gin?中間件?Next()方法示例詳解

    這篇文章主要介紹了Golang?Gin?中間件?Next()方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Go Comparable Type原理深入解析

    Go Comparable Type原理深入解析

    這篇文章主要為大家介紹了Go Comparable Type原理深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Go 語言下基于Redis分布式鎖的實(shí)現(xiàn)方式

    Go 語言下基于Redis分布式鎖的實(shí)現(xiàn)方式

    本篇文章將詳細(xì)介紹如何正確地實(shí)現(xiàn)Redis分布式鎖,下面通過一個(gè)項(xiàng)目基于 Redis 的分布式鎖能夠提供哪些分布鎖特性,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • 淺析golang如何處理json中的null

    淺析golang如何處理json中的null

    json?是一種常用的數(shù)據(jù)格式,在?go?使用?json?序列化和反序列化時(shí)比較方便的,但在使用過程中,會(huì)遇到一些問題,比如?null,所以下面我們就來看看golang如何處理json中的null吧
    2023-09-09

最新評(píng)論

乳山市| 无锡市| 南丹县| 许昌市| 东丰县| 静安区| 尤溪县| 宁乡县| 垦利县| 调兵山市| 关岭| 秀山| 五峰| 前郭尔| 大连市| 垣曲县| 武强县| 五寨县| 雅安市| 英山县| 平遥县| 肇州县| 繁昌县| 新疆| 碌曲县| 临汾市| 灵寿县| 武宣县| 临江市| 当雄县| 土默特右旗| 苗栗市| 水富县| 台前县| 平凉市| 东兴市| 西乌| 东阳市| 墨竹工卡县| 平罗县| 阿拉善右旗|