Go 標準庫 —— sync.Mutex 互斥鎖

來源:互聯網
上載者:User
Mutex 是一個互斥鎖,可以建立為其他結構體的欄位;零值為解鎖狀態。Mutex 類型的鎖和線程無關,可以由不同的線程加鎖和解鎖。

方法

func (*Mutex) Lock

func (m *Mutex) Lock()

Lock 方法鎖住 m,如果 m 已經加鎖,則阻塞直到 m 解鎖。

func (*Mutex) Unlock

func (m *Mutex) Unlock()

Unlock 方法解鎖 m,如果 m 未加鎖會導致執行階段錯誤。

注意

  • 在一個 goroutine 獲得 Mutex 後,其他 goroutine 只能等到這個 goroutine 釋放該 Mutex

使用 Lock() 加鎖後,不能再繼續對其加鎖,直到利用 Unlock() 解鎖後才能再加鎖

  • 在 Lock() 之前使用 Unlock() 會導致 panic 異常
  • 已經鎖定的 Mutex 並不與特定的 goroutine 相關聯,這樣可以利用一個 goroutine 對其加鎖,再利用其他 goroutine 對其解鎖
  • 在同一個 goroutine 中的 Mutex 解鎖之前再次進行加鎖,會導致死結
  • 適用於讀寫不確定,並且只有一個讀或者寫的情境

執行個體

package mainimport (    "fmt"    "sync"    "time")func main() {    var mutex sync.Mutex    wait := sync.WaitGroup{}    fmt.Println("Locked")    mutex.Lock()    for i := 1; i <= 3; i++ {        wait.Add(1)        go func(i int) {            fmt.Println("Not lock:", i)            mutex.Lock()            fmt.Println("Lock:", i)            time.Sleep(time.Second)            fmt.Println("Unlock:", i)            mutex.Unlock()            defer wait.Done()        }(i)    }    time.Sleep(time.Second)    fmt.Println("Unlocked")    mutex.Unlock()    wait.Wait()}

運行結果:

LockedNot lock: 1Not lock: 2Not lock: 3UnlockedLock: 1Unlock: 1Lock: 2Unlock: 2Lock: 3Unlock: 3

參考

  • 標準庫文檔 —— sync.Mutex
  • golang 中 sync.Mutex 和 sync.RWMutex
原文地址: https://shockerli.net/post/go...
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.