乐观锁和悲观锁

乐观锁:

概念:悲观想法,每次去拿数据的时候都会认为别人会进行修改,所以在每次拿数据的时候都会进行上锁。这样别人想要拿数据的时候就会被挡住,直至悲观锁被释放,悲观锁中的额共享资源每次都只能给一个线程使用,其他线程堵塞,直至用完后再将资源转让给其他线程。
效率:处理加锁解锁的机制会额外产生开销,还会增加产生死锁的机会。另外还会降低并行性,如果已经锁定至线程A,其他线程都需要等待该线程A处理完,方才可以进行处理。
锁:行锁、表锁、连锁(共享锁)、写锁(排他锁),以及使用syncronized实现的锁均为悲观锁。

乐观锁:

概念:乐观想法,每次拿数据都认为别人不会进行修改数据,所以每次拿数据时都不会上锁。但如果想要更新数据,则会在更新数据前检查读取至更新这段时间内别人是否有修改这个数据。若修改了,则重新读取,并再次尝试更新,循环上述步骤直至更新成功(当然也存在更新失败的线程放弃更新操作的),乐观锁适用于多读少操作的应用类型,提高吞吐量。
比较:相对于悲观锁,在对数据操作时,乐观锁不会对数据库进行加锁的机制,而是使用记录数据版本号活时间戳来实现,一版版本记录使用较多。乐观锁一版不会产生任何锁和死锁的。

使用场景:

  • 悲观锁阻塞事务、乐观锁回滚重试:他们各有各的优缺点。乐观锁适用于写少读多的情况,即冲突极低的情况下,这样可以省去开加锁的开销,提高系统的吞吐量。但写多,经常产生冲突的情况下,就适合使用悲观锁。

乐观锁的注意点:

如果一个变量的值读取时是A,在准备修改的时候还是A,那么我们能够说明它没有被其他线程进行修改过么?
显然不能,有可能被多个线程进行修改,最后一个线程又被修改了回来。这个时候我们应该怎么做?根据时间戳和版本号进行判断,我们优选版本号,在每次操作时都将版本号+1,每次进行操作时根据值和版本号进行判断!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值