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


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/golang-pkg-mutex/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM