讀寫鎖實(shí)際是一種特殊的 自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進(jìn)行讀訪問,寫者則需要對共享資源進(jìn)行寫操作。這種鎖相對于 自旋鎖而言,能提高 并發(fā)性,因?yàn)樵?nbsp;多處理器系統(tǒng)中,它允許同時(shí)有多個(gè)讀者來訪問共享資源,最大可能的讀者數(shù)為實(shí)際的邏輯CPU數(shù)。寫者是排他性的,一個(gè)讀寫鎖同時(shí)只能有一個(gè)寫者或多個(gè)讀者(與CPU數(shù)相關(guān)),但不能同時(shí)既有讀者又有寫者。是因?yàn)槎鄠€(gè)goroutine對同一個(gè)map產(chǎn)出了競爭,解決這個(gè)問題的方法有兩個(gè),一個(gè)是用sync.Map,另一個(gè)是加鎖。sync.map是go1.9新加的特性,這里暫且先不討論。而且當(dāng)前業(yè)務(wù)場景用讀寫鎖完全可以解決,所以決定使用讀寫鎖。
站在用戶的角度思考問題,與客戶深入溝通,找到白水網(wǎng)站設(shè)計(jì)與白水網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋白水地區(qū)。
讀寫鎖
RWMutex是一個(gè)讀寫鎖,該鎖可以加多個(gè)讀鎖或者一個(gè)寫鎖,其經(jīng)常用于讀次數(shù)遠(yuǎn)遠(yuǎn)多于寫次數(shù)的場景。
func (rw *RWMutex) Lock() 寫鎖,如果在添加寫鎖之前已經(jīng)有其他的讀鎖和寫鎖,則lock就會(huì)阻塞直到該鎖可用,為確保該鎖最終可用,已阻塞的 Lock 調(diào)用會(huì)從獲得的鎖中排除新的讀取器,即寫鎖權(quán)限高于讀鎖,有寫鎖時(shí)優(yōu)先進(jìn)行寫鎖定
func (rw *RWMutex) Unlock() 寫鎖解鎖,如果沒有進(jìn)行寫鎖定,則就會(huì)引起一個(gè)運(yùn)行時(shí)錯(cuò)誤
func (rw *RWMutex) RLock() 讀鎖,當(dāng)有寫鎖時(shí),無法加載讀鎖,當(dāng)只有讀鎖或者沒有鎖時(shí),可以加載讀鎖,讀鎖可以加載多個(gè),所以適用于"讀多寫少"的場景
func (rw *RWMutex) RUnlock() 讀鎖解鎖,RUnlock 撤銷單次RLock 調(diào)用,它對于其它同時(shí)存在的讀取器則沒有效果。若 rw 并沒有為讀取而鎖定,調(diào)用 RUnlock 就會(huì)引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤
概括:
讀鎖不能阻塞讀鎖
讀鎖需要阻塞寫鎖,直到所有讀鎖都釋放
寫鎖需要阻塞讀鎖,直到所有寫鎖都釋放
寫鎖需要阻塞寫鎖
上代碼:
type MapWithLock struct { //把讀寫鎖和資源map封裝在一起 sync.RWMutex M map[string]Kline } var KlineDataMemory = make(map[string] interface{}) var InstrLock sync.RWMutex var counter = MapWithLock{ // 生成一個(gè)帶有鎖和map的實(shí)例,然后就可以使用啦 InstrLock, KlineDataMemory, } . . . counter.RLock() //加讀鎖 for _, v := range counter.M { instrID = v.InstrumentID break } counter.RUnlock() //解除讀鎖 加鎖和解鎖必須成對出現(xiàn),并且建議放在同一層次的代碼塊中
以上就是golang讀鎖有什么用的詳細(xì)內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!