当前位置:网站首页>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问题
循环时间长开销大
只能保证一个共享变量的原子操作
边栏推荐
猜你喜欢
55.【sort函数的升序降序】
MySQL表的约束
2022高压电工特种作业证考试题库及答案
织梦自定义表单添加全选和全不选功能按钮
FP6606CLP5 SOP-8 USB Type-C和PD充电控制器
How a "cloud" can bring about new changes in the industry
Mini Program Graduation Works WeChat Gymnasium Reservation Mini Program Graduation Design Finished Product (8) Graduation Design Thesis Template
年轻人接棒大妈,金价跌回“4字头”,七夕迎黄金消费小热潮
打补丁的日子,比写代码的日子难熬多了
恒驰5真的没大卖
随机推荐
我用这一招让团队的开发效率提升了 100%!
9月起中国给予多哥等16国98%税目产品零关税待遇
Wechat Gymnasium Appointment Mini Program Graduation Design Finished Works (7) Mid-term Inspection Report
织梦提示信息提示框美化
【21天学习挑战赛学习打卡】顺序查找
有关代购系统搭建的那点事
ES: Promise的基本用法
红队实战靶场ATT&CK(一)
MySQL基本语法
新特性解读 | MySQL 8.0 GIPK 不可见主键
罗敏背后是抖音
创新云集技术咖,工赋汇聚实战派:2022工赋开发者峰会
54.【system系统互动函数大总结】
判断文件属主
Remember the stuck analysis of an industrial automation control system in .NET
恒驰5真的没大卖
golang源码分析(33)pollFD
基于HDF的LED驱动程序开发(1)
C#里如何简单的校验时间格式
天翼云4.0来了!千城万池,无所不至!