悲观锁和乐观锁

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

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

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

   乐观锁解决方法:

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

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

 

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

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

posted @ 2023-02-11 17:05  Bepowerful  阅读(18)  评论(0)    收藏  举报