package main
import (
"fmt"
"sync"
)
type myMutex struct {
count int
sync.Mutex
}
func main() {
var mu myMutex
mu.Lock()
var mu2 = mu
mu.count++
mu.Unlock()
mu2.Lock()
mu2.count++
mu2.Unlock()
fmt.Println(mu.count,mu2.count)
}
如上,在锁住时将锁拷贝了一份,运行时会报死锁。然后将程序稍作修改,注释掉了mu2.Lock()操作,则可以正常运行。
主要原因:在拷贝锁时会同时拷贝它的状态,mu2没有解锁直接又进行加锁操作所以发生死锁了。
package main
import (
"fmt"
"sync"
)
type myMutex struct {
count int
sync.Mutex
}
func main() {
var mu myMutex
mu.Lock()
mu.count++
var mu2 = mu
mu.Unlock()
//mu2.Lock()
mu2.count++
mu2.Unlock()
fmt.Println(mu.count,mu2.count)
}