乐观锁与悲观锁

CAS

线程读取共享数据时不上锁,先将其保存到当前线程的副本中,当该线程执行更新操作时,先去比较线程副本和当前线程共享的值是否一致,如果不一致,表示数据被其他线程修改过,先读取数据,再重复以上步骤。一致的话表示没有被其他线程修改过,直接更新本次修改的数据。

ABA

CAS会产生ABA问题,如下图:

时间顺序线程1线程2说明
T1X=A-线程1设置X
T2复杂的运算(start)修改X=B线程2修改X为B
T3处理简单业务逻辑-
T4修改X=A线程2修改X为A
T5复杂运算(end)结束线程2线程2结束
T6检测X=A,验证通过,提交事务-CAS检测通过,因为X的值没变(线程副本和共享数据一致)

上图说明线程1执行复杂运算的过程中,X的值被线程2修改了,容易导致运算出错。这个问题就是ABA问题。解决办法就是乐观锁:hibernate或mybatis中,会为PO增加一个version字段。

乐观锁

乐观锁的实现可以通过在表里面加一个version字段的形式,每个线程更新的时候都会判断当前的version是否跟我查询出来的一致,不一致就更新失败,一致就更新这条记录并并设置version=version+1。
乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

悲观锁:认为拿到数据后可能会被别人修改,所以每次都加锁,这样会降低性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值