golang 锁使用请小心陷阱

关于锁使用

减少读写锁粒度和范围大小,尽可能尽早释放,锁和 defer 配合使用容易踩坑,因为会出现死锁,意思就是,这段代码可能会重复加锁,这种问题可能是偶发引起的,所以很难排查。

  1. 提前 unlock
    image.png

  2. 不能提前 unlock 怎么办?如何处理???
    image.png

image.png
image.png
image.png

以上就是处理锁提前返回防止坑,能够知道锁什么时间释放很重要,往往很多坑就是这个函数已经 lock 锁了,然后再调用另外一个函数 a->b->c->d, 如此调用链;你不会知道这些函数是否也调用了这个函数的锁实例,导致死锁的发生。而且还有一点,像上图的 SendMessage 可能是一个耗时调用,那么这个锁就会一直阻塞在这里得不到释放。像我遇到的一个坑就是调用 SendMessage 函数,然后这个函数给客户端发送消息,然后由于客户端种种原因导致消息发送失败触发我的 close 函数,然后 close 内部处理资源清理导致再调用这个锁实例的函数导致重复加锁,这个 😭😭BUG 隐藏的很深,一般看不出来。

原文链接:www.zhanggaoyuan.com/article/61

原文标题:[golang 请谨甚入坑]

本站使用「 署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)」创作共享协议,转载或使用请署名并注明出处。

本作品采用《CC 协议》,转载必须注明作者和本文链接
by JeffreyBool blog :point_right: link
JeffreyBool
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!