今日浅浅一问:乐观锁与悲观锁

什么是乐观锁和悲观锁

乐观锁

乐观锁是一种并发控制的思想。它假设在数据处理过程中,很少会出现冲突的情况,所以在读取数据时不会进行加锁操作。在进行更新操作时,会先判断数据在读取后是否被其他线程修改过,如果没有被修改过,才会进行更新;如果被修改过,则重新读取数据再次尝试更新。

悲观锁

悲观锁则持有一种比较悲观的态度,它认为在数据处理过程中,冲突经常会发生,所以在读取数据时就会对数据进行加锁,阻塞其他线程对该数据的操作,直到当前线程完成操作并释放锁。

乐观锁与悲观锁各自的优缺点

乐观锁的优点:

  • 并发性高:由于在读取数据时不会加锁,多个线程可以同时读取数据,从而提高了系统的并发性能。

  • 减少阻塞:降低了因为锁竞争导致线程阻塞的情况,提高了系统的响应性。

  • 降低系统开销:不需要频繁地获取和释放锁,节省了系统资源。

乐观锁的缺点:

  1. 回滚概率高:在冲突频繁的情况下,更新操作可能会频繁失败,需要进行回滚和重试,增加了系统的复杂性和开销。

  2. 适用场景有限:对于数据一致性要求极高、冲突概率较大的场景不太适用。

悲观锁的优点:

  1. 数据一致性强:能够严格保证数据在同一时间只有一个线程进行操作,避免了数据不一致的问题。

  2. 简单易懂:实现相对简单,逻辑清晰。

  3. 适用范围广:适用于对数据一致性要求严格、并发冲突可能性较大的场景。

悲观锁的缺点:

  1. 并发性差:加锁会阻塞其他线程,降低了系统的并发处理能力。

  2. 系统开销大:频繁的加锁和解锁操作会消耗较多的系统资源。
     

如何判断什么场景下使用哪种锁?

1.数据一致性要求

  • 如果对数据的一致性要求非常严格,不容许有任何错误或不一致的情况出现,那么悲观锁可能更合适。例如银行交易、财务系统等关键业务场景。
  • 若数据一致性有一定的容错空间,或者可以通过其他方式来处理少数不一致的情况,乐观锁可能是一个较好的选择。

2.并发冲突频率

  • 当并发冲突的可能性较高,预计会有大量线程同时竞争同一资源时,悲观锁可以有效地避免冲突导致的数据错误。
  • 若并发冲突较少,乐观锁能够更好地发挥其高并发的优势,减少锁带来的性能开销。

3.系统性能要求

  • 对于性能要求较高,希望尽可能提高系统的并发处理能力和响应速度的场景,乐观锁通常更有利。
  • 如果系统对性能的要求不是特别高,而更注重数据的稳定性和准确性,悲观锁可能更适合。

4.业务逻辑复杂性

  • 业务逻辑较为简单,处理冲突的逻辑相对容易实现时,乐观锁可能更容易应用。
  • 若业务逻辑复杂,处理冲突的成本较高,悲观锁可以简化业务逻辑的实现。

5.资源竞争程度

  • 当资源竞争激烈,锁的持有时间较长时,悲观锁可能导致严重的阻塞和性能下降,此时乐观锁可能更合适。
  • 反之,如果资源竞争不激烈,悲观锁的影响较小,可以考虑使用。

例如,在一个电商的库存管理系统中,如果商品库存数量较大,且同时购买的并发量不高,冲突较少,那么可以使用乐观锁。但如果是热门商品,在促销活动期间并发量极大,容易出现频繁的冲突,此时可能悲观锁更为合适,以确保库存数据的准确无误。

又如,在一个在线文档编辑系统中,如果多个用户同时编辑同一文档的概率较低,且对于偶尔出现的冲突可以通过合并等方式解决,那么乐观锁是一个不错的选择。但如果是多人实时协作编辑,对文档的一致性要求极高,悲观锁可能更能满足需求。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值