关于锁的两个小技巧

现在我们的开发中越来越多用锁的情况,锁其实比cas恐怖很多,像性能问题,死锁问题,延时问题,都是极难排查的问题

之前在学习中掌握了一些技巧,在这里分享一下

[b]1.open call[/b]
并发编程里面有一个术语“open call”

意思就是当我们在调用一个lock的方式时,我们需要将手中的锁释放掉(如果我们正持有锁),或者尽量避免去调用会lock的方法

看起来很简单,其实这还是很麻烦的事情

这要求我们做到这几点:

a.在所有带锁的方法中都显性地表明:我会加锁的,比如方法名,或者注释

b.把锁封装起来(注意,这个过程不一定是面向对象的)

c.把锁都放到同一层面上同一方法中,也就是说我们如果一个业务要加两个锁,那我们就要么把两个锁都加在service,要么就都放在bo中,在同一个方法块里面去做

[b]2.避免反向加锁[/b]
有80%以上的死锁问题是由于反向加锁,大部分的gui程序也是由于这个问题,放弃了多线程的方案,通通采用了单线程模型

换句话来说,我们只要想办法做到,顺序加锁,我们就能避免80%以上的死锁问题

a.最简单的,我们给类的加锁定义一个方向

比如,我们先对房间加锁,再对用户加锁

b.对于同一类的不同对象的加锁,我们用一个比较器,统一排一个序,再加锁

比如用户锁,我们先根据用户id排个序,然后逐一加锁
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值