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...