golang 锁请小心使用


关于锁使用

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

  1. 提前 unlock
    golang 锁请小心使用

  2. 不能提前 unlock 怎么办?如何处理???
    golang 锁请小心使用
    golang 锁请小心使用
    golang 锁请小心使用
    golang 锁请小心使用

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

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


文章作者: JellyTony
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 JellyTony !
评论
 上一篇
golang获取文件摘要算法性能详细对比 golang获取文件摘要算法性能详细对比
现在我们开发网站基本摆脱不了上传文件的功能,但是上传文件的可能有几百M 或者几个G, 如果不做秒传的话会带来很多的功能。例如:用户体验不好,同一个文件还要多次上传到服务器。浪费服务器带宽和资源。如果我们做了秒传就会解决上面带来的问题,可以在客户端计算文件的摘要,和服务器算法保持一致就可以做到秒传了,客户端拿着算好的摘要去服务端判断这个文件是否已经上传,如果上传了直接返回文件信息,没有上传就调用上传接口
2020-06-05
本篇 
  目录