乐观锁 VS 悲观锁(简述)

本文探讨了Java中的乐观锁和悲观锁概念。悲观锁在多线程环境中倾向于预先锁定资源,如synchronized和Lock实现,而乐观锁假设并发冲突少,通常使用CAS算法,在更新时检查是否有冲突。Java原子类中的递增操作即为乐观锁的一个实例。
- title: 乐观锁 VS 悲观锁
- date: 2021/8/15

1. 乐观锁 vs 悲观锁

乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有对此概念对应的实际应用;

悲观锁:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此无论共享的数据是否会出现竞争,它都会进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁(锁消除))。Java中,synchronized关键字和Lock的实现类都是悲观锁。

Java中的悲观锁就是Synchronized , AQS框架下的锁则是先尝试CAS乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。

乐观锁:乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后执行比较跟上一次的版本号,如果一样则更新,如果失败则要重复读-比较-写的操作。

乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。

img

参考资料:

  1. 不可不说的Java“锁”事 - 美团技术团队 (meituan.com)
  2. 《深入理解Java虚拟机》
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值