关于锁的两个小技巧

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

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

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

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

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

这要求我们做到这几点:

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

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

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

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

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

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

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

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

比如用户锁,我们先根据用户id排个序,然后逐一加锁

猜你喜欢

转载自snake1987.iteye.com/blog/1670489