互斥鎖定
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),編譯器將不會警告你這個錯誤!