golang中sync包實現了兩種鎖Mutex (互斥鎖)和RWMutex(讀寫鎖),其中RWMutex是基於Mutex實現的,只讀鎖的實現使用相似引用計數器的功能.golang
type Mutex func (m *Mutex) Lock() func (m *Mutex) Unlock() type RWMutex func (rw *RWMutex) Lock() func (rw *RWMutex) RLock() func (rw *RWMutex) RLocker() Locker func (rw *RWMutex) RUnlock() func (rw *RWMutex) Unlock()
一、互斥鎖code
其中Mutex爲互斥鎖,Lock()加鎖,Unlock()解鎖,使用Lock()加鎖後,便不能再次對其進行加鎖,直到利用Unlock()解鎖對其解鎖後,才能再次加鎖.適用於讀寫不肯定場景,即讀寫次數沒有明顯的區別,而且只容許只有一個讀或者寫的場景,因此該鎖葉叫作全局鎖。權限
func (m *Mutex) Unlock()用於解鎖m,若是在使用Unlock()前未加鎖,就會引發一個運行錯誤.已經鎖定的Mutex並不與特定的goroutine相關聯,這樣能夠利用一個goroutine對其加鎖,再利用其餘goroutine對其解鎖。引用
互斥鎖只能鎖定一次,當在解鎖以前再次進行加鎖,便會死鎖狀態,若是在加鎖前解鎖,便會報錯「panic: sync: unlock of unlocked mutex」goroutine
二、讀寫鎖co
RWMutex是一個讀寫鎖,該鎖能夠加多個讀鎖或者一個寫鎖,其常常用於讀次數遠遠多於寫次數的場景.阻塞
func (rw *RWMutex) Lock() 寫鎖,若是在添加寫鎖以前已經有其餘的讀鎖和寫鎖,則lock就會阻塞直到該鎖可用,爲確保該鎖最終可用,已阻塞的 Lock 調用會從得到的鎖中排除新的讀取器,即寫鎖權限高於讀鎖,有寫鎖時優先進行寫鎖定
func (rw *RWMutex) Unlock() 寫鎖解鎖,若是沒有進行寫鎖定,則就會引發一個運行時錯誤sync
func (rw *RWMutex) RLock() 讀鎖,當有寫鎖時,沒法加載讀鎖,當只有讀鎖或者沒有鎖時,能夠加載讀鎖,讀鎖能夠加載多個,因此適用於"讀多寫少"的場景錯誤
func (rw *RWMutex)RUnlock() 讀鎖解鎖,RUnlock 撤銷單次RLock 調用,它對於其它同時存在的讀取器則沒有效果。若 rw 並無爲讀取而鎖定,調用 RUnlock 就會引起一個運行時錯誤(注:這種說法在go1.3版本中是不對的,例以下面這個例子)。版本
讀寫鎖的寫鎖只能鎖定一次,解鎖前不能屢次鎖定,讀鎖能夠屢次,但讀解鎖次數最多隻能比讀鎖次數多一次,通常狀況下咱們不建議讀解鎖次數多餘讀鎖次數