同步——sync.RWMutex讀寫鎖ui
RWMutex是一個讀寫鎖,該鎖能夠加多個讀鎖或者一個寫鎖,其常常用於讀次數遠遠多於寫次數的場景。code
func (rw *RWMutex) RLock() func (*RWMutex) RUnlock // 讀解鎖
讀鎖,寫鎖和讀鎖互斥,當只有讀鎖或者沒有寫鎖時,能夠加載讀鎖,讀鎖能夠加載多個,因此適用於「讀多寫少」的場景ci
func (rw *RWMutex) Lock() func (*RWMutex) Unlock // 寫解鎖
寫鎖,若是在添加寫鎖以前已經有其餘的讀鎖和寫鎖,則lock就會阻塞直到該鎖可用,爲確保該鎖最終可用,已阻塞的 Lock 調用會從得到的鎖中排除新的讀取器,即寫鎖權限高於讀鎖,有寫鎖時優先進行寫鎖定同步
和Java中的 ReentrantReadWriteLock 都實現類似的功能。it
下面用Go的讀寫鎖改寫餘額操做的例子,io
import ( "sync" ) var ( mu sync.RWMutex // guards balance balance int ) // 使用讀鎖保護對變量的讀取 func Balance() int { mu.RLock() defer mu.RUnlock() b := balance return b } func Withdraw(amount int) bool { mu.Lock() defer mu.Unlock() deposit(-amount) if balance < 0 { deposit(amount) return false // insufficient funds } return true } func Deposit(amount int) { mu.Lock() defer mu.Unlock() deposit(amount) } // This function requires that the lock be held. func deposit(amount int) { balance += amount }
==========END==========function