文章目录

  • 悲观锁(Pessimistic Lock)
    • 优缺点与适用场景
    • 实现方式(mysql里)
  • 乐观锁(Optimistic Locking)
    • 优缺点与适用场景
    • 实现方式

悲观锁与乐观锁并不是真正意义上的锁,而是对数据的加锁策略

悲观锁(Pessimistic Lock)

是一种对数据的修改持有悲观态度的并发控制方式。总是假设最坏的情况,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。

优缺点与适用场景

优点:对每次读取数据都进行加锁,解决了脏读、幻读和不可重复读等可能存在的问题
缺点:每次都加锁降低了系统的吞吐量,并发量大时许多线程都被阻塞
适用场景:适用于读少写多的情况下,经常产生冲突的场景

实现方式(mysql里)

select for .... update
获取锁的前提:结果集中的数据没有使用排他锁或共享锁时,才能获取锁,否则将会阻塞。

例如、

select * from tbl_user where id=1 for update;

需要注意的是,for update 生效需要同时满足两个条件时才生效:

  1. 数据库的引擎为 innoDB
  2. 操作位于事务块中(BEGIN/COMMIT)

当执行 select … for update时,将会把数据锁住,因此,我们需要注意一下锁的级别。MySQL InnoDB 默认为行级锁。当查询语句指定了主键时,MySQL会执行「行级锁」,否则MySQL会执行「表锁」。
常见情况如下:

  • 若明确指明主键,且结果集有数据,行锁;
  • 若明确指明主键,结果集无数据,则无锁;
  • 若无主键,且非主键字段无索引,则表锁;
  • 若使用主键但主键不明确,则使用表锁;

实例
在窗口1上执行

// 关闭mysql数据库的自动提交属性
set autocommit=0;
// 开启事务
BEGIN;
SELECT * FROM tbl_user where id=1 for update;

然后再在窗口2执行获取锁语句 select * from tbl_user where id=1 for update;

那么窗口2并没有像窗口1一样,立刻返回结果,而是发生了阻塞,返回了一个error信息

ERROR 1205: Lock wait timeout exceeded; try restarting transaction

乐观锁(Optimistic Locking)

乐观锁是相对悲观锁而言的,是一种对数据的修改持有悲观态度的并发控制方式。乐观锁假设数据一般情况不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。

优缺点与适用场景

优点:省去了锁的开销,加大了系统的整个吞吐量
缺点:1、ABA问题。 2、循环时间长开销大。 3、只能保证一个共享变量的原子操作

  • ABA 问题

线程1从数据库中取出某数据为A,这时候线程2也从数据库中某数据为A;
并且线程2进行了一些操作将数据变成了 B、然后线程2又将数据变成 A,
这时候线程1进行 CAS 操作发现数据库中仍然是A,然后线程一操作成功。
尽管线程一的 CAS 操作成功,但是不代表这个过程就是没有问题的。

  • 循环时间长开销大

自旋CAS(也就是不成功就一直循环执行直到成功)如果长时间不成功,会给CPU带来非常大的执行开销。

  • 只能保证一个共享变量的原子操作

CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效。

适用场景:适用于读多写少的情况(多读场景),冲突较少的场景

实现方式

1、版本号机制

在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加1。
当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

2、CAS算法
即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。

CAS算法涉及到三个操作数
1、需要读写的内存值 V
2、进行比较的值 A
3、拟写入的新值 B

当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试。

面试必备之 悲观锁与乐观锁相关推荐

  1. 悲观锁和乐观锁_面试必备之乐观锁与悲观锁

    何谓悲观锁与乐观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人. 大家可以点 ...

  2. 面试官问:说说悲观锁、乐观锁、分布式锁?都在什么场景下使用?有什么技巧?...

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 如何确保一个方法,或者一块代码在高并发情况下,同一时间只能 ...

  3. 华为应用锁退出立即锁_面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景...

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  4. 面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  5. java面试(二)--(1)EJB的几种类型(2)Hibernate的悲观锁和乐观锁(3) 二叉搜索树与双向链表

    1.请说明一下EJB的几种类型分别是什么? EJB(Enterprise JavaBean)是J2EE服务器端的组件模型,EJB包括会话Bean(Session Bean).实体Bean(Entity ...

  6. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

    何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...

  7. lock是悲观锁还是乐观锁_图文并茂的带你彻底理解悲观锁与乐观锁

    点击上方蓝色字体,选择"设置星标" 优质文章,第一时间送达 文章转自:Hollis 原创:安静的boy 这是一篇介绍悲观锁和乐观锁的入门文章.旨在让那些不了解悲观锁和乐观锁的小白们 ...

  8. 悲观锁的实现方式java_并发编程--锁--悲观锁和乐观锁

    悲观锁和乐观锁并不是某个具体的"锁"而是一种并发编程的基本概念,是根据看待并发同步的角度.乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入. 悲观锁 ...

  9. 探索JAVA并发 - 悲观锁和乐观锁

    作者:acupt,专注Java,架构师社区合伙人! 什么是悲观锁,什么是乐观锁,它们是如何实现的? 定义 悲观锁:对世界充满不信任,认为一定会发生冲突,因此在使用资源前先将其锁住,具有强烈的独占和排他 ...

最新文章

  1. 预测汽车级Linux专业技术的需求
  2. 青少年是维护网络安全的主力军
  3. 安装VS 2008 EXPRESS出现无法读取deffactory.dat错误
  4. 485. Max Consecutive Ones - LeetCode
  5. 计算机编程嘉兴,嘉兴自学电脑编程一对一
  6. 【毕业设计】一种多商家网络商店的设计与实现(源代码+论文)
  7. SQLServer版本对应内部数据库版本号配置表
  8. mfc c++string、char与char*之间的关系
  9. arcgis 中北京1954 高斯克吕格投影说明
  10. linux asio,在Linux使用Asio:不可或缺的WineASIO
  11. IPX/SPX 协议
  12. Farkas 定理的几何证明
  13. 因果推断-PSM的原理及python实现
  14. vue-cli项目代理proxyTable配置exclude的方法
  15. Could not get unknown property ‘packageForR‘ for task ‘:app:processDebugResources‘ of type com.andro
  16. 抖音、快手打起来了,互联网大佬集体内卷?
  17. 简要分析“区块链+物联网”有哪些坎?
  18. 浪潮存储:基于系统级可靠性设计,为数据存储保驾护航
  19. iOS客户端的title不显示解决方案
  20. 最佳值换算法c语言,页面置换算法---最佳置换算法(OPT)

热门文章

  1. 红米无线连接服务器,电脑无线连接红米手机远程管理启动技巧
  2. 移动端图片预览插件-fly-zomm-img.min.js
  3. vue在移动端出现的问题以及解决方式
  4. JS将秒数换算成时分秒 以及转化为年月日 时分秒
  5. 一定要学会的vsCode格式化整理代码的快捷键,再也不用手动调格式了
  6. HR人力资源管理精粹70则
  7. You need Perl 5 安装openssl时报错,提示需要安装perl 5
  8. 微信小程序中使用ECharts实现报表图表展示
  9. SpringMVC 用对象接收 ajax提交form表单
  10. 从零开始大数据--Hadoop、HDFS、MapReduce、HBase、Hive