package main import ( "sync" ) var m sync.RWMutex func main() { list := []int{1, 2, 3, 4, 5, 6} for _, item := range list { read(item) write(item) } } func read(i int) { m.RLock() if i > 2 { return } m.RUnlock() } func write(i int) { m.Lock() print("args:", i) m.Unlock() }
结果:all goroutines are asleep - deadlock!
分析: 如果程序中途有结束操作,不会释放锁,
方案:
1、必须保证中途没有结束或者break操作
2、下列方式可以预防,在func结束后释放锁:
m.RLock() defer m.RUnlock()