在go中,锁的传递是值传递。即当把一个锁赋给另一个锁时,实际上获取的是这个锁的副本,这个副本也包含了锁的状态。
我们来看一下下面这段代码:
type MyMutex struct{
count int;
sync.Mutex;
}
func main() {
var mu MyMutex
mu.Lock()
var mu1=mu
mu.count++
mu.Unlock()
mu1.Lock()
mu1.count++
mu1.Unlock()
fmt.Println(mu.count,mu1.count)
}
这段代码会产生死锁,是因为var mu1=mu时,mu1会获得一个已经上了锁的锁,这个锁是mu变量中锁的副本,所以即使mu.Unlock()了,由于mu1没有Unlock(),所以继续调用mu1.Lock()会死锁,因为要等待mu1释放自己的锁。
在mu.Unlock()和mu1.Lock()中增加一行mu1.Unlock(),便可以正常的输出
func main() {
var mu MyMutex
mu.Lock()
var mu1=mu
mu.count++
mu.Unlock()
mu1.Unlock()
mu1.Lock()
mu1.count++
mu1.Unlock()
fmt.Println(mu.count,mu1.count)
}