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

IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题

MySQL基本操作和基于MySQL基本操作的综合实例项目

文件上传很难搞?10分钟带你学会阿里云OSS对象存储

Security First: Tools You Need to Know to Implement DevSecOps Best Practices

一文看懂推荐系统:概要01:推荐系统的基本概念

一朵“云“如何带来产业新变革

深圳地铁16号线二期进入盾构施工阶段,首台盾构机顺利始发

搭建属于自己的知识库(Wikijs)

erp系统和wms系统有什么区别

C#里如何简单的校验时间格式
随机推荐
Cpolar application example of data acquisition equipment
Flink学习9:配置idea开发flink-Scala程序环境
阿里云关系型数据库RDS是干嘛额?
vulnhub W34kn3ss: 1
Redis总结_实战篇
mui中使用多级选择器实现省市区联动
有关代购系统搭建的那点事
白话电子签章原理及风险
全面认识二极管,一篇文章就够了
Dream weaving prompt information prompt box beautification
Go 语言快速入门指南:第二篇 变量与常量
2022高压电工特种作业证考试题库及答案
Ubuntu系统下用docker安装oracle
深圳地铁16号线二期进入盾构施工阶段,首台盾构机顺利始发
MySQL基本操作和基于MySQL基本操作的综合实例项目
H5网页播放器EasyPlayer.js播放器界面的加载效果无法消失是什么原因?
IReport常见问题及处理方法
MySQL表的约束
搭建属于自己的知识库(Wikijs)
故障分析 | 一条 SELECT 语句跑崩了 MySQL ,怎么回事?