golang互斥鎖跟讀寫鎖

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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

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()

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版本中是不對的,例如下面這個例子)。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.