您好,登錄后才能下訂單哦!
Go語言中RWMutex如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
讀寫鎖:是計算機程序的并發(fā)控制的一種同步機制,也稱“共享-互斥鎖”、多讀者-單寫者鎖。讀操作可并發(fā)重入,寫操作是互斥的。
主要適用的場景是:讀多寫少的業(yè)務(wù)場景。這種場景下如果每次讀寫都使用互斥鎖那么整個效率就會變得很低。因為只是讀的話并不需要互斥鎖來鎖住數(shù)據(jù),只有寫操作的時候需要互斥鎖,而讀寫結(jié)合的時候,也是需要加鎖的,不然的話會導(dǎo)致讀的數(shù)據(jù)不一定是期望的。
對于RWMutex的規(guī)則如下:
1、可以隨便讀,多個goroutine同時讀。
2、寫的時候,不能讀也不能寫。
主要有下面四個API構(gòu)成,讀鎖RLock,RUnlock,寫鎖Lock,Unlock。
對于讀寫鎖來說,可以拆分成下面四種情況:
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, 只有讀的操作:
結(jié)果分析:通過運行的結(jié)果我們可以看出來,多個讀操作不需要等到前一個讀事件結(jié)束了,才去執(zhí)行下一個讀事件, 所以一旦我們在RLock和RUnlock之間修改共享變量num的時候,有兩個協(xié)程5號和3號會讀到相同的數(shù)值3。
2.2 例子2, 只有寫的操作:
結(jié)果分析:只有寫操作的時候,每一次執(zhí)行的結(jié)果num都是遞增的,不會出現(xiàn)亂序,這就說明,寫鎖的加鎖和解鎖是互斥的,必需一個加鎖和解鎖結(jié)束了,才執(zhí)行下一次。
2.3 例子3,讀事件進(jìn)行的過程中,寫事件到達(dá):
結(jié)果分析:通過上面的輸出結(jié)果,我們可以看出寫事件的goroutinue在2號讀數(shù)據(jù)的goroutinue結(jié)束就開始啟動了,因為其他的讀協(xié)程已經(jīng)用讀鎖鎖住了,所以在這些調(diào)用了讀鎖的這些讀協(xié)程都釋放了讀鎖之后,寫鎖才開始從 阻塞中被拿出來重新執(zhí)行。
2.4 例子4,寫事件進(jìn)行的過程中,讀事件到達(dá):
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(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)容。