悲观锁和乐观锁

悲观锁:认为线程问题一定会发生,在操作数据之前就获取锁,确保线程串行执行。列如Synchronized、lock

乐观锁:认为线程问题不一定发生,因此不加锁,只是在更新数据时去判断有没有其他线程对数据进行了修改。如果没有修改则认为是安全的,自己才更新数据。

如果已经被其他线程修改说明发生了安全问题,此时可以重试或异常。

   乐观锁解决方法:

1.额外设置一个版本号,每个线程处理的时候加1,处理数据前判断版本是否和刚开始查询的数据一致(把版本号当作查询条件)(where语句做判断),一致则继续处理数据,否则重试或者异常;

2.cas法:在版本控制方法基础上,剔除额外的版本,直接将已经查询到的需要更新的数据(库存)当作条件和原先查询的数据进行比较,如果和原先数据不一致则重试或者返回异常。(数据库进行操作不是使用Java中的if对原先查询到的数据和需要更改的数据做判断而是理解为用where做判断是在执行更新操作的一瞬间)

 

cas方法改进,当前操作只能满足当库存等于查找的时候的库存相等为条件,会导致若一个线程更改成功,剩下的线程则无法更改,会导致很多线程执行失败,因此这里的判断条件不需要库存和原先的值相等,只需要库存数量大于0即可。

当然如果跟新的数据不是这种库存信息,只能判断前后信息是否一致,才此基础上想要解决成功率低的问题,因此也可以采取分段锁的方法。(数据分成几个表去几个表中抢)。


__EOF__

本文作者liuliu的小家
本文链接https://www.cnblogs.com/liu-jin/p/17112085.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Bepowerful  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示