互斥锁定

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),编译器将不会警告你这个错误!