当前位置:网站首页>面试官:可以谈谈乐观锁和悲观锁吗
面试官:可以谈谈乐观锁和悲观锁吗
2022-08-02 17:43: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问题
循环时间长开销大
只能保证一个共享变量的原子操作
边栏推荐
猜你喜欢

C语言中的一系列操作符

故障分析 | 一条 SELECT 语句跑崩了 MySQL ,怎么回事?

Wechat Gymnasium Appointment Mini Program Graduation Design Finished Work (5) Task Book

阿波罗 planning代码-modules\planning\lattice\trajectory_generation\PiecewiseBrakingTrajectoryGenerator类详解

宝塔搭建实测-基于ThinkPHP5.1的wms进销存源码

土巴兔IPO五次折戟,互联网家装未解“中介”之痛

Go 语言快速入门指南: 介绍及安装

二叉查找树的查找

安全至上:落地DevSecOps最佳实践你不得不知道的工具

2022安全员-C证考试题库模拟考试平台操作
随机推荐
多聚体/壳聚糖修饰白蛋白纳米球/mPEG-HSA聚乙二醇人血清白蛋白纳米球的制备与研究
golang刷leetcode动态规划(10)编辑距离
腾讯架构师是如何解释:Redis高性能通信的原理(精华版)
Remember the stuck analysis of an industrial automation control system in .NET
2022安全员-C证考试题库模拟考试平台操作
Wechat Gymnasium Appointment Mini Program Graduation Design Finished Works Mini Program Graduation Design Finished Work (6) Question Opening Reply PPT
Navicat 连接Oracle时提示oracle library is not loaded的问题解决
golang刷leetcode 经典(5)设计哈希集合
golang源码分析(4):select
什么是SVN(Subversion)?
IReport常见问题及处理方法
MySQL基本操作和基于MySQL基本操作的综合实例项目
一文搞懂│php 中的 DI 依赖注入
C#里如何简单的校验时间格式
HDF驱动框架的API(2)
golang源码分析(8):m、p、g、shedt、sudog
golang源码分析(6):sync.Mutex sync.RWMutex
Google Earth Engine APP—— 一个不用写代码可以直接下载相应区域的1984-2021年的GIF遥感影像动态图
vulnhub W34kn3ss: 1
安全至上:落地DevSecOps最佳实践你不得不知道的工具