并发情况下加锁和解锁的时机

加锁:多个线程读取同一个数据,后续业务需要对获取到的此数据进行业务的判断,比如唯一性,是否执行过等等业务,再根据判断的结果决定是否执行不同的后续业务流程

 

解锁:可以不用等到方法执行完再解锁,但是,一定要等上面加锁的数据在进行了后续业务之后再解锁。否则。会出现数据不一致的情况

 

比如,判断a用户是否给id为1的数据点赞,点赞了之后就不再保存点赞数据,如果没有,保存点赞数据。那么加锁就是在读取数据库检查用户是否点赞之前加锁,解锁需要等到保存点赞数据或者方法执行结束再解锁。

如果在得到用户是否点赞了之后马上解锁,那么会出现下面这种情况。

加锁->查询数据库->得到没有点赞的结果->解锁->保存点赞数据->结束

                                                                   加锁->查询数据库->得到没有点赞的结果->解锁->保存点赞数据->结束

也就是说在解锁之后,点赞数据还没有保存成功,但是有其它线程又到了查询那里,数据没有保存完成,查到的结果还是未点赞,所以后面还是会执行保存数据的流程,导致最终重复点赞(原来网上说的手快点可以点赞2次是真的!哈哈哈哈哈,开个玩笑^_^)。


版权声明:本文为u013958151原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。