通过锁的传递理解go互斥锁的值传递

在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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值