同步之sync.RWMutex讀寫鎖

同步——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

相關文章
相關標籤/搜索