首页 > 其他分享 >[BAT面试题系列]乐观锁和悲观锁

[BAT面试题系列]乐观锁和悲观锁

时间:2023-03-01 16:25:26浏览次数:35  
标签:面试题 加锁 CAS BAT 乐观 线程 悲观 数据

基本概念

乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题(使用非常广泛,不局限于某种编程语言或数据库)。

  • 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。
  • 悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

竞争激烈程度

乐观锁和悲观锁并没有优劣之分,它们有各自适合的场景;

如果悲观锁和乐观锁都可以使用,那么选择就要考虑竞争的激烈程度:

  • 当竞争不激烈 (出现并发冲突的概率小)时,乐观锁更有优势,因为悲观锁会锁住代码块或数据,其他线程无法同时访问,影响并发,而且加锁和释放锁都需要消耗额外的资源。
  • 当竞争激烈(出现并发冲突的概率大)时,悲观锁更有优势,因为乐观锁在执行更新时频繁失败,需要不断重试,浪费CPU资源。

乐观锁加锁吗?

乐观锁本身是不加锁的,只是在更新时判断一下数据是否被其他线程更新了。

有时乐观锁也可能与加锁操作合作,例如MySQL在执行update时会加排它锁。但这只是乐观锁与加锁操作合作的例子,不能改变“乐观锁本身不加锁”这一事实。

CAS有哪些缺点

ABA问题

假设有两个线程——线程1和线程2,两个线程按照顺序进行以下操作:

(1)线程1读取内存中数据为A;

(2)线程2将该数据修改为B;

(3)线程2将该数据修改为A;

(4)线程1对数据进行CAS操作

在第(4)步中,由于内存中数据仍然为A,因此CAS操作成功,但实际上该数据已经被线程2修改过了。这就是ABA问题。

高竞争下的开销问题

在并发冲突概率大的高竞争环境下,如果CAS一直失败,会一直重试,CPU开销较大。针对这个问题的一个思路是引入退出机制,如重试次数超过一定阈值后失败退出。当然,更重要的是避免在高竞争环境下使用乐观锁。

功能限制

CAS的功能是比较受限的,例如CAS只能保证单个变量(或者说单个内存值)操作的原子性,这意味着:(1)原子性不一定能保证线程安全,例如在Java中需要与volatile配合来保证线程安全;(2)当涉及到多个变量(内存值)时,CAS也无能为力。

除此之外,CAS的实现需要硬件层面处理器的支持,在Java中普通用户无法直接使用,只能借助atomic包下的原子类使用,灵活性受到限制。

标签:面试题,加锁,CAS,BAT,乐观,线程,悲观,数据
From: https://www.cnblogs.com/hkwJsxl/p/17168675.html

相关文章

  • 滴滴前端二面常考react面试题(持续更新中)
    什么是React的refs?为什么它们很重要refs允许你直接访问DOM元素或组件实例。为了使用它们,可以向组件添加个ref属性。如果该属性的值是一个回调函数,它将接受底层的DOM元素......
  • 美团前端二面经典react面试题总结
    React事件机制<divonClick={this.handleClick.bind(this)}>点我</div>React并不是将click事件绑定到了div的真实DOM上,而是在document处监听了所有的事件,当事件发生并......
  • 悲观锁和乐观锁
    悲观锁(PessimisticLock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关......
  • 六、MybatisPlus实现乐观锁
    乐观锁场景一件商品,成本价是80元,售价是100元。老板先是通知小李,说你去把商品价格增加50元。小李正在玩游戏,耽搁了一个小时。正好一个小时后,老板觉得商品价格增加到150元,......
  • Mybatis(b战狂神版笔记)
    Mybatis1.简介Mybatis是什么?MyBatis是一款优秀的持久层框架它支持自定义SQL、存储过程以及高级映射MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果......
  • day07-MyBatis的关联映射01
    MyBatis的关联映射Mybatis的关联映射实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提......
  • mybatis:自定义映射关系resultMap
    创建表t_emp定义实体类packageorg.example.entity;publicclassEmp{privateIntegerempId;privateStringempName;privateIntegerage;pr......
  • mybatis自增主键的获取
    实体类packageorg.example.entity;publicclassUser{privateIntegerid;privateStringname;privateintage;privateStringgender;p......
  • 【Mybatis】【配置文件解析】【四】Mybatis源码解析-mappers的解析四(绑定Mapper、处理
    1 前言我们上节把我们mapper里的sql节点以及我们的增删改查都解析了,那么最后回来就剩下两块没看了,一块是我们的mapper跟我们的接口绑定,一块就是我们在解析的过程中......
  • bat文件简短
    bat文件@echooffF:cd\pictures\projectStreet\FloatingShinyKnot-mainnodeserver.jscd\bat静默运行(但会闪一下)if"%1"=="h"gotobeginmshtavbscript:......