当前位置:网站首页>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问题
循环时间长开销大
只能保证一个共享变量的原子操作
边栏推荐
猜你喜欢
【秒杀办法】根据二叉树的先序遍历、中序遍历、后序遍历快速创建二叉树
Go 语言快速入门指南: 介绍及安装
C语言中的一系列操作符
MySQL基本操作和基于MySQL基本操作的综合实例项目
IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题
Wechat Gymnasium Appointment Mini Program Graduation Design Finished Work (5) Task Book
Navicat 连接Oracle时提示oracle library is not loaded的问题解决
宝塔搭建实测-基于ThinkPHP5.1的wms进销存源码
0725-面试记录
C#里如何简单的校验时间格式
随机推荐
Google Earth Engine APP—— 一个不用写代码可以直接下载相应区域的1984-2021年的GIF遥感影像动态图
Several common cross-domain solutions
shell中awk命令的if条件语句引入外置变量
erp系统和wms系统有什么区别
What is the difference between erp system and wms system
Playing in the cloud | The key technology of Tianyi cloud object storage ZOS high availability is revealed
小程序毕设作品之微信体育馆预约小程序毕业设计成品(6)开题答辩PPT
golang刷leetcode 经典(1) LRU缓存机制
Go 语言快速入门指南:第二篇 变量与常量
0725-面试记录
Mini Program Graduation Works WeChat Gymnasium Reservation Mini Program Graduation Design Finished Product (8) Graduation Design Thesis Template
cpolar应用实例之多设备数据采集
牛津硕士进碳圈,高瓴红杉经纬一起投了
究极异常处理逻辑——多层次异常的处理顺序
织梦提示信息提示框美化
故障分析 | 一条 SELECT 语句跑崩了 MySQL ,怎么回事?
文件上传很难搞?10分钟带你学会阿里云OSS对象存储
红队实战靶场ATT&CK(一)
打补丁的日子,比写代码的日子难熬多了
golang刷leetcode 经典(4) 实现跳表