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 main
import (
"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()
}
執行結果:
Locked
Not lock: 1
Not lock: 2
Not lock: 3
Unlocked
Lock: 1
Unlock: 1
Lock: 2
Unlock: 2
Lock: 3
Unlock: 3
參考
原文地址: https://shockerli.net/post/go…
更多文章請訪問我的個人部落格: https://shockerli.net