乐观锁和悲观锁的介绍以及应用场景

很多程序,比如秒杀程序这种,我们经常只限定卖出去一定量的订单,但是往往这种秒杀活动,大量的用户并发的请求我们的服务器,因此如果按我们的正常的程序流程:

①用户登录前端页面--->②访问后台服务器--->③判断是否还有库存--->④有库存则库存减一,下单成功。

但是,往往这种请求都是大量且并发的,因此由于多个线程,往往会出现异常,发生超卖的现象。

正常情况

异常情况

如上图,显然发生超卖是由于我们线程①在查询库存后,发现库存够,然后准备扣减库存,而在扣减库存前,线程②也来查询库存,发现也够,也进行扣减库存,而此时如果库存只有一个,但是两个线程甚至更多线程都判断库存够,都去扣减库存,因此就会发生超卖的现象。

那么,如何解决上述问题呢?这里很容易想到可以给线程加“锁”,目前我们常见的锁有两种:①悲观锁②乐观锁。

“悲观锁”:悲观锁的思想是认为所有程序都一定会发生线程问题,因此对于某个程序,每进来一个线程,先去判断锁有没有人获取,如果此时锁没人获取,那么就获取锁后进行程序的下一步,而其他线程此时来判断锁有无被获取发现已经被人获取,那么此时就阻塞进程,等待获取锁的那个线程释放锁后再获取锁,进行程序的下一步。JAVA中我们常用的synchronize、lock等锁都是悲观锁。

“乐观锁”:乐观锁的思想是认为程序不会发生线程问题,因此并不像悲观锁那样会阻塞进程,而是对于某个数据加上一个版本号,比如:对于某个商品,我们查询库存的时候会给当前数据加上一个版本号①,当修改库存的时候,会判断现在的版本号(也就是查询出来的版本号)和此时数据库中数据的版本号一不一致,如果一致则修改,如果不一致则不修改。版本号是一个判断标志,当数据每修改一次,版本号便会递增一次,因此对于上述的线程问题:“就算只剩下一个商品时,多个线程同时查询发现库存足够,准备去修改库存时,第一个修改库存的线程发现数据库中版本与查询出来的一致,便扣减库存,下单成功,同时让该数据版本递增一次;而其他线程在准备修改该数据时,发现版本与先前查询的版本不一致,便无法扣减库存。”便解决了线程问题。我们平时数据库中,如MySQL数据库常会用到乐观锁。

以上便是悲观锁和乐观锁的思想和应用场景。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
乐观锁悲观锁都是常见的机制,用于解决并发访问数据时可能出现的数据一致性问题。它们在使用场景上有一些差异。 乐观锁适用于并发读取操作较多,写入操作较少的场景。乐观锁的实现方式是在读取数据时不加,而是在更新数据时进行版本比较。如果在更新数据时发现版本已经被其他线程修改,则会回滚当前操作,让用户重新操作。乐观锁的优点是实现简单,不会阻塞其他操作。但是它无法阻止除程序之外的数据库操作,并且在写入冲突较多时可能导致较多的重试操作。 悲观锁适用于写入操作较频繁的场景。悲观锁是在读取数据时加,阻塞其他线程的写入操作,直到当前线程完成读取操作后才释放悲观锁的优点是可以保证数据的一致性,但是它会增加的开销,降低系统的吞吐量。悲观锁适用于对数据一致性要求较高的场景,但是需要注意避免死问题。 总之,乐观锁适用于读多写少的场景,悲观锁适用于写多读少并对数据一致性要求较高的场景。具体使用哪种机制需要根据业务场景和需求来进行分析和选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [乐观锁悲观锁介绍以及应用场景](https://blog.csdn.net/weixin_64366370/article/details/128648091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [乐观锁悲观锁各自适用场景是什么?](https://blog.csdn.net/sD7O95O/article/details/116382290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值