golang互斥鎖跟讀寫鎖

2021-08-21 20:13:40 字數 1127 閱讀 9651

golang中sync包實現了兩種鎖mutex (互斥鎖)和rwmutex(讀寫鎖),其中rwmutex是基於mutex實現的,唯讀鎖的實現使用類似引用計數器的功能.

1、互斥鎖

其中mutex為互斥鎖,lock()加鎖,unlock()解鎖,使用lock()加鎖後,便不能再次對其進行加鎖,直到利用unlock()解鎖對其解鎖後,才能再次加鎖.適用於讀寫不確定場景,即讀寫次數沒有明顯的區別,並且只允許只有乙個讀或者寫的場景,所以該鎖葉叫做全域性鎖。

func (m *mutex) unlock()用於解鎖m,如果在使用unlock()前未加鎖,就會引起乙個執行錯誤.已經鎖定的mutex並不與特定的goroutine相關聯,這樣可以利用乙個goroutine對其加鎖,再利用其他goroutine對其解鎖。

互斥鎖只能鎖定一次,當在解鎖之前再次進行加鎖,便會死鎖狀態,如果在加鎖前解鎖,便會報錯「panic: sync: unlock of unlocked mutex」

2、讀寫鎖

rwmutex是乙個讀寫鎖,該鎖可以加多個讀鎖或者乙個寫鎖,其經常用於讀次數遠遠多於寫次數的場景.

func (rw *rwmutex) lock()  寫鎖,如果在新增寫鎖之前已經有其他的讀鎖和寫鎖,則lock就會阻塞直到該鎖可用,為確保該鎖最終可用,已阻塞的 lock 呼叫會從獲得的鎖中排除新的讀取器,即寫鎖許可權高於讀鎖,有寫鎖時優先進行寫鎖定

func (rw *rwmutex) unlock() 寫鎖解鎖,如果沒有進行寫鎖定,則就會引起乙個執行時錯誤

func (rw *rwmutex) rlock() 讀鎖,當有寫鎖時,無法載入讀鎖,當只有讀鎖或者沒有鎖時,可以載入讀鎖,讀鎖可以載入多個,所以適用於"讀多寫少"的場景

func (rw *rwmutex)runlock() 讀鎖解鎖,runlock 撤銷單次rlock 呼叫,它對於其它同時存在的讀取器則沒有效果。若 rw 並沒有為讀取而鎖定,呼叫 runlock 就會引發乙個執行時錯誤(注:這種說法在go1.3版本中是不對的,例如下面這個例子)。

讀寫鎖的寫鎖只能鎖定一次,解鎖前不能多次鎖定,讀鎖可以多次,但讀解鎖次數最多只能比讀鎖次數多一次,一般情況下我們不建議讀解鎖次數多餘讀鎖次數

golang之讀寫鎖,互斥鎖的理解

golang sync包裡提供了 locker介面 互斥鎖 mutex 讀寫鎖 rwmutex用於處理併發過程中可能出現同時兩個或多個協程 或執行緒 讀或寫同乙個變數的情況。在併發的情況下,多個執行緒或協程同時去修改乙個變數。使用鎖能保證在某一時間點內,只有乙個協程或執行緒修改這一變數,具體我們可以...

互斥鎖和讀寫鎖

互斥鎖的型別 對資源的訪問是互斥的,即執行緒a對資源加鎖後,在a解鎖前,其他執行緒不能訪問這個加鎖的資源。互斥鎖的特點 多個執行緒訪問資源的時候是序列的 互斥鎖的使用步驟 建立乙個互斥鎖 pthread mutex t mutex 初始化這把鎖 pthread mutex init mutex,nu...

互斥鎖機制,互斥鎖與讀寫鎖區別

互斥鎖 mutex,用於保證在任何時刻,都只能有乙個執行緒訪問該物件。當獲取鎖操作失敗時,執行緒會進入睡眠,等待鎖釋放時被喚醒 讀寫鎖 rwlock,分為讀鎖和寫鎖。處於讀操作時,可以允許多個執行緒同時獲得讀操作。但是同一時刻只能有乙個執行緒可以獲得寫鎖。其它獲取寫鎖失敗的執行緒都會進入睡眠狀態,直...