溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go語言中RWMutex如何使用

發(fā)布時間:2021-07-06 15:50:48 來源:億速云 閱讀:205 作者:Leah 欄目:大數(shù)據(jù)

Go語言中RWMutex如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

1.基本概念

讀寫鎖:是計算機程序的并發(fā)控制的一種同步機制,也稱“共享-互斥鎖”、多讀者-單寫者鎖。讀操作可并發(fā)重入,寫操作是互斥的。

主要適用的場景是:讀多寫少的業(yè)務(wù)場景。這種場景下如果每次讀寫都使用互斥鎖那么整個效率就會變得很低。因為只是讀的話并不需要互斥鎖來鎖住數(shù)據(jù),只有寫操作的時候需要互斥鎖,而讀寫結(jié)合的時候,也是需要加鎖的,不然的話會導(dǎo)致讀的數(shù)據(jù)不一定是期望的。

對于RWMutex的規(guī)則如下:

1、可以隨便讀,多個goroutine同時讀。

2、寫的時候,不能讀也不能寫。

主要有下面四個API構(gòu)成,讀鎖RLock,RUnlock,寫鎖Lock,Unlock。

Go語言中RWMutex如何使用

Go語言中RWMutex如何使用

2.實例分析

對于讀寫鎖來說,可以拆分成下面四種情況:

1)讀事件結(jié)束之后,寫事件到達(dá)。2)讀事件進(jìn)行的過程中,寫事件到達(dá) 。3)寫事件完成之后,讀事件到達(dá)。  4)寫事件進(jìn)行的過程中,讀事件到達(dá)。5) 只有讀的操作。6)只有寫的操作。

對于1)和3)來說,讀事件和寫事件是順序執(zhí)行的,不會出現(xiàn)相互影響的問題,我們主要來看下2),4), 5),6)兩種情況的例子。

2.1 例子1, 只有讀的操作:

Go語言中RWMutex如何使用

Go語言中RWMutex如何使用

結(jié)果分析:通過運行的結(jié)果我們可以看出來,多個讀操作不需要等到前一個讀事件結(jié)束了,才去執(zhí)行下一個讀事件, 所以一旦我們在RLock和RUnlock之間修改共享變量num的時候,有兩個協(xié)程5號和3號會讀到相同的數(shù)值3。

2.2 例子2, 只有寫的操作:

Go語言中RWMutex如何使用

Go語言中RWMutex如何使用

結(jié)果分析:只有寫操作的時候,每一次執(zhí)行的結(jié)果num都是遞增的,不會出現(xiàn)亂序,這就說明,寫鎖的加鎖和解鎖是互斥的,必需一個加鎖和解鎖結(jié)束了,才執(zhí)行下一次。

2.3 例子3,讀事件進(jìn)行的過程中,寫事件到達(dá):

Go語言中RWMutex如何使用

Go語言中RWMutex如何使用

結(jié)果分析:通過上面的輸出結(jié)果,我們可以看出寫事件的goroutinue在2號讀數(shù)據(jù)的goroutinue結(jié)束就開始啟動了,因為其他的讀協(xié)程已經(jīng)用讀鎖鎖住了,所以在這些調(diào)用了讀鎖的這些讀協(xié)程都釋放了讀鎖之后,寫鎖才開始從 阻塞中被拿出來重新執(zhí)行。

2.4 例子4,寫事件進(jìn)行的過程中,讀事件到達(dá):

Go語言中RWMutex如何使用

Go語言中RWMutex如何使用

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI