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