可以保证某一个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))
}
正常是可能会死锁的,如果调整Unlock的顺序,可以解决死锁的问题。
举个例子:
协程1 :在unlock db2之前,goroutine 发送了调度;
协程2 :需要加锁db2,需要协程1 先解锁 db2锁。