这个方法一定不会死锁吗

可以保证某一个goroutine先获取到db1加锁,db2也一定被当前goroutine加锁吗?  
/\*\*  
需要竞争的锁同时加锁,防止加锁互斥等待进入死锁  
\*/  
func lock(db1, db2 \*dbconnect, wait \*sync.WaitGroup) {  
   fmt.Println("进入业务逻辑...")  
   defer wait.Done()  
   db1.mutex.Lock()  
   //加这个等待,程序会死锁,不加等待测试多次不会锁,可以保证某一个goroutine先获取到db1加锁,db2也一定被当前goroutine加锁吗?  
  //time.Sleep(1 \* time.Second)  
  db2.mutex.Lock()  
  
   defer db1.mutex.Unlock()  
   defer db2.mutex.Unlock()  
  
   time.Sleep(1 \* time.Second)  
   db1.size++  
  
   time.Sleep(1 \* time.Second)  
   db2.size++  
   fmt.Println("goroutine执行结果:" \+ gconv.String(db1.size) + gconv.String(db2.size))  
}
阅读 2.1k
2 个回答

正常是可能会死锁的,如果调整Unlock的顺序,可以解决死锁的问题。
举个例子:

协程1 :在unlock db2之前,goroutine 发送了调度;
协程2 :需要加锁db2,需要协程1 先解锁 db2锁。

如果只是加加,请用原子操作

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题