悲观锁和乐观锁
悲观锁:认为线程问题一定会发生,在操作数据之前就获取锁,确保线程串行执行。列如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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/liu-jin/p/17112085.html
关于博主:hello~好久不见,喜欢的话点个赞吧
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
分类:
java / 锁机制
, java / 并发编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY