乐观锁和悲观锁

本文介绍了并发控制中的两种锁机制——乐观锁和悲观锁,并解释了它们的工作原理及应用场景。乐观锁通常用于读多写少的情况,通过版本号来避免冲突;悲观锁则假设竞争激烈,采用锁定资源的方式防止并发冲突。

1、数据库方面:

  悲观锁就是for update
  乐观锁就是 version字段

2、JDK方面:
  悲观锁就是sync
  乐观锁就是原子类(内部使用CAS机制实现)

悲观锁

    认为总会有人抢我的。
乐观锁
    
认为基本没人抢,认为读多写少,遇到并发写的可能性比较低,所以采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。

CAS(Compare and swap)

    比较和替换是设计并发算法时用到的一种技术,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。

    CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

ABA问题(来自知乎)

    小明在提款机,提取了50元,因为提款机问题,
        有两个线程,同时把余额从100变为50

            线程1(提款机):获取当前值100,期望更新为50,

            线程2(提款机):获取当前值100,期望更新为50,

            线程1成功执行,线程2某种原因block了,这时,某人给小明汇款50

            线程3(默认):获取当前值50,期望更新为100,

            这时候线程3成功执行,余额变为100,

            线程2从Block中恢复,获取到的也是100,compare之后,继续更新余额为50!!!

            此时可以看到,实际余额应该为100(100-50+50),但是实际上变为了50(100-50+50-50),这就是ABA问题带来的成功提交。

转载于:https://www.cnblogs.com/yakov1380/p/9021201.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值