Golang中如何避免死锁:加锁

sync.RWMutexRLock()sync.Mutexsync.RWMutexLock()
互斥sync.Mutexsync.RWMutex
sync.Mutexsync.Mutex
sync.RWMutexsync.RWMutexLock()

踩坑点

将上面的结论展开一下,更清晰得说(为避免理解偏差宁可唠叨一些):

sync.Mutexsync.RWMutexmu.Lock()sync.RWMutexmu.Lock()mu.RLock()
fatal error: all goroutines are asleep - deadlock!

所以以下函数不会造成 panic:

readAndRead

注: 在 goroutine 中的 panic 不会影响主程序,所以在测试时要注意并不是没有 panic 输出就一定是没发生。