当前位置:网站首页>Interviewer: can you talk about optimistic locking and pessimistic locks
Interviewer: can you talk about optimistic locking and pessimistic locks
2022-08-02 20:34:00 【InfoQ】
什么是悲观锁和乐观锁
悲观锁
乐观锁
两种锁的使用场景
- 原子性不一定能保证线程安全,例如在Java中需要与volatile配合来保证线程安全;
- 当涉及到多个变量(内存值)时,CAS也无能为力.
- 当竞争不激烈 (出现并发冲突的概率小)时,乐观锁更有优势,因为悲观锁会锁住代码块或数据,其他线程无法同时访问,影响并发,而且加锁和释放锁都需要消耗额外的资源.
- 当竞争激烈(出现并发冲突的概率大)时,悲观锁更有优势,因为乐观锁在执行更新时频繁失败,需要不断重试,浪费CPU资源.
乐观锁主要两种实现方式
乐观锁一般会使用版本号机制或CAS算法实现.
版本号机制
- 线程 A 此时将其读出( version=1 ),并从其帐户余额中扣除 200( 2 0 0 ( 1000-$200 ).
- 在线程 A 操作的过程中,线程B 也读入此用户信息( version=1 ),并从其帐户余额中增加 300 ( 3 0 0 ( 1000+$300 ).
- 线程 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣除后余额( balance=$800 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 .
- 线程 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数据( balance=$1300 ),但此时比对数据库记录版本时发现,线程 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足 “ 提交版本必须大于记录当前版本才能执行更新 “ 的乐观锁策略,因此,线程 B 的提交被驳回.
CAS算法
- 需要读写的内存值 V
- 进行比较的值 A
- 拟写入的新值 B
乐观锁的缺点
ABA问题
循环时间长开销大
只能保证一个共享变量的原子操作
边栏推荐
猜你喜欢
vulnhub W34kn3ss: 1
Wechat Gymnasium Appointment Mini Program Graduation Design Finished Works Mini Program Graduation Design Finished Work (6) Question Opening Reply PPT
方法的使用
MySQL命令(命令行方式,而非图形界面方式)
打补丁的日子,比写代码的日子难熬多了
vulnhub W34kn3ss: 1
mui中使用多级选择器实现省市区联动
C#里如何简单的校验时间格式
Flink学习9:配置idea开发flink-Scala程序环境
HDF驱动框架的API(1)
随机推荐
What is the difference between erp system and wms system
魔豹联盟:佛萨奇2.0dapp系统开发模式详情
Simulink脚本自动创建Autosar Parameter Port及Mapping
golang学习之七:并发编程基础(goroutine、channel、select)
每日优鲜倒了,叮咚买菜的春天在哪?
2021年下半年软件设计师上午真题
恒驰5真的没大卖
多聚体/壳聚糖修饰白蛋白纳米球/mPEG-HSA聚乙二醇人血清白蛋白纳米球的制备与研究
小程序毕设作品之微信体育馆预约小程序毕业设计成品(6)开题答辩PPT
腾讯架构师是如何解释:Redis高性能通信的原理(精华版)
全面认识二极管,一篇文章就够了
ffmpeg编译后找不到libx264
2022安全员-C证考试题库模拟考试平台操作
玩转云端 | 天翼云对象存储ZOS高可用的关键技术揭秘
嵌入式Qt-做一个秒表
ffmpeg cannot find libx264 after compilation
脉脉上的相亲生意
阿波罗 planning代码-modules\planning\lattice\trajectory_generation\PiecewiseBrakingTrajectoryGenerator类详解
新特性解读 | MySQL 8.0 GIPK 不可见主键
Flink Learning 9: Configure the idea to develop the flink-Scala program environment