互斥鎖定

Go 中的互斥鎖定允許你確保一次只有一個 goroutine 具有鎖定:

import "sync"

func mutexTest() {
    lock := sync.Mutex{}
    go func(m *sync.Mutex) {
        m.Lock()
        defer m.Unlock()   // Automatically unlock when this function returns
        // Do some things
    }(&lock)

    lock.Lock()
    // Do some other things
    lock.Unlock()
}

使用 Mutex 可以避免競爭條件,併發修改以及與在同一資源上執行的多個併發例程相關的其他問題。請注意,Mutex.Unlock() 可以由任何例程執行,而不僅僅是獲得鎖定的例程。另請注意,如果另一個例程保持鎖定,對 Mutex.Lock() 的呼叫不會失敗; 它將阻塞,直到鎖被釋放。

提示: 每當你將 Mutex 變數傳遞給函式時,始終將其作為指標傳遞。否則,會複製你的變數,這會違反互斥鎖的用途。如果你使用較舊的 Go 版本(<1.7),編譯器將不會警告你這個錯誤!