針對(duì)Golang 1.9的sync.RWMutex進(jìn)行分析,與Golang 1.10基本一樣除了將panic改為了throw之外其他的都一樣。
RWMutex是讀寫(xiě)互斥鎖。鎖可以由任意數(shù)量的讀取器或單個(gè)寫(xiě)入器來(lái)保持。
RWMutex的零值是一個(gè)解鎖的互斥鎖。
以下代碼均去除race競(jìng)態(tài)檢測(cè)代碼
源代碼位置:sync\rwmutex.go
結(jié)構(gòu)體
type RWMutex struct { w Mutex // 互斥鎖 writerSem uint32 // 寫(xiě)鎖信號(hào)量 readerSem uint32 // 讀鎖信號(hào)量 readerCount int32 // 讀鎖計(jì)數(shù)器 readerWait int32 // 獲取寫(xiě)鎖時(shí)需要等待的讀鎖釋放數(shù)量 }
常量
const rwmutexMaxReaders = 1 30 // 支持最多2^30個(gè)讀鎖
方法
Lock
提供寫(xiě)鎖操作.
func (rw *RWMutex) Lock() { // 競(jìng)態(tài)檢測(cè) if race.Enabled { _ = rw.w.state race.Disable() } // 使用Mutex鎖 rw.w.Lock() // Announce to readers there is a pending writer. r := atomic.AddInt32(rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders // Wait for active readers. if r != 0 atomic.AddInt32(rw.readerWait, r) != 0 { runtime_Semacquire(rw.writerSem) } // 競(jìng)態(tài)檢測(cè) if race.Enabled { race.Enable() race.Acquire(unsafe.Pointer(rw.readerSem)) race.Acquire(unsafe.Pointer(rw.writerSem)) } }
RLock
提供讀鎖操作,
func (rw *RWMutex) RLock() { // 競(jìng)態(tài)檢測(cè) if race.Enabled { _ = rw.w.state race.Disable() } // 每次goroutine獲取讀鎖時(shí),readerCount+1 // 如果寫(xiě)鎖已經(jīng)被獲取,那么readerCount在-rwmutexMaxReaders與0之間,這時(shí)掛起獲取讀鎖的goroutine, // 如果寫(xiě)鎖沒(méi)有被獲取,那么readerCount>0,獲取讀鎖,不阻塞 // 通過(guò)readerCount判斷讀鎖與寫(xiě)鎖互斥,如果有寫(xiě)鎖存在就掛起goroutine,多個(gè)讀鎖可以并行 if atomic.AddInt32(rw.readerCount, 1) 0 { // 將goroutine排到G隊(duì)列的后面,掛起goroutine runtime_Semacquire(rw.readerSem) } // 競(jìng)態(tài)檢測(cè) if race.Enabled { race.Enable() race.Acquire(unsafe.Pointer(rw.readerSem)) } }
RLocker
可以看到RWMutex實(shí)現(xiàn)接口Locker.
type Locker interface { Lock() Unlock() }
而方法RLocker就是將RWMutex轉(zhuǎn)換為L(zhǎng)ocker.
func (rw *RWMutex) RLocker() Locker { return (*rlocker)(rw) }
總結(jié)
讀寫(xiě)互斥鎖的實(shí)現(xiàn)比較有技巧性一些,需要幾點(diǎn)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
標(biāo)簽:東營(yíng) 昭通 駐馬店 泰安 阿壩 晉中 瀘州 滄州
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解golang RWMutex讀寫(xiě)互斥鎖源碼分析》,本文關(guān)鍵詞 詳解,golang,RWMutex,讀寫(xiě),互斥,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。