什么是乐观锁,什么是悲观锁?
在互联网公司面试中,很多小伙伴都被问到关于锁的理解。今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁。
1、锁的定义
1)乐观锁
首先来看乐观锁,顾名思义,乐观锁就是持比较乐观态度的锁。就是在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断在此期间别的线程有没有更新过这个数据。
2)悲观锁
反之,悲观锁就是持悲观态度的锁。就在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿到这个数据就会阻塞直到它拿到锁。
2、如何理解锁
举个例子,有时候我们上公共厕所的时候要排队。如果你蹲马桶的时候开着门,外面有人排着队看着你。你会这么做吗?当然,如果在自己家里,有可能会这么干,这就是乐观锁。虽然,能进到房间,但是有人占着坑位,该排队还是得排队。比如数据库提供的类似于write_condition机制,Java API 并发工具包下面的原子变量类就是使用了乐观锁的CAS来实现的。
悲观锁就不同了,就相当于是进房间之后,第一件事就是把门锁上,那在门外排队等候的人不知道里面发生了什么,又着急但是又只能干等着,这就是悲观锁。比如行锁、表锁、读锁、写锁,都是在操作之前先上锁,Java API中的synchronized和ReentrantLock等独占锁都是悲观锁思想的实现。
3、锁的应用场景
根据前面对两种锁的介绍,总结一下两种锁的应用场景:
首先来看乐观锁,它适用于写少读多的情况,也就是说减少操作冲突,这样可以省去锁竞争的开销,提高系统的吞吐量。
而悲观锁呢,它适用于写多读少的情况。因为,如果还使用乐观锁的话,会经常出现操作冲突,这样会导致应用层会不断地Retry,反而会降低系统性能。
说了这么多,小伙伴们思考一下,你认为秒杀场景下,并发下单和支付应该使用什么锁?
我是被编程耽误的文艺Tom,关注我,面试不再难!
最后, 6/7/8月份资料文档已整理,包含如下↓(还在持续更新中!):
①100道最新大厂经典面试题解析资料文档!
②15万+字Java面试题解析和配套答案!
③从应届生到高级开发都适用的简历模板!
④从入门到精通的程序员学习路线图!
完整版面试资料和答案以及PDF文档 :
扫描下方名片领取!
↓ ↓ ↓
什么是乐观锁,什么是悲观锁?相关推荐
- laravel mysql 悲观锁_[笔记] 悲观锁与乐观锁
在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲 ...
- mysql悲观锁乐观锁定义_悲观锁乐观锁的定义
悲观锁,正如其名,具有强烈的独占和排他特性,它指的是对数据被外界修改持保守态度.乐观锁机制采取了更加宽松的加锁机制,乐观锁是相对悲观锁而言,也是为了避免数据库幻读.业务处理时间过长等原因引起数据处理错 ...
- mysql默认乐观锁悲观锁_MySQL中悲观锁和乐观锁到底是什么?-阿里云开发者社区...
索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁. 行锁就是按 ...
- mysql中的乐观锁_MySQL中悲观锁和乐观锁到底是什么?
索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁.行锁就是按照 ...
- 大聪明教你学Java | 深入浅出聊乐观锁与悲观锁(synchronized 悲观锁)
前言 "锁"一直是一个老生常谈问题,尤其是在面试的过程中我们常常会被问到"锁"的一些相关的问题,其中就数"悲观锁"和"乐观锁&qu ...
- 乐观锁(CAS)和悲观锁(synchronized)的详细介绍
1. 锁的定义 在代码中多个线程需要同时操作共享变量,这时需要给变量上把锁,保证变量值是线程安全的. 锁的种类非常多,比如:互斥锁.自旋锁.重入锁.读写锁.行锁.表锁等这些概念,总结下来就两种类型,乐 ...
- 悲观锁代码java_悲观锁的代码实现如何编写?
悲观锁相信大家都不陌生了,之前说过了悲观锁的各种原理,这次我们就来聊聊悲观锁是如何实现的吧. 悲观锁,就跟它的名字意思一样,它非常悲观,它的机制就是对数据被外界(包括本系统当前的其他事务,以及来自外部 ...
- mysql悲观锁关键字_MySQL悲观锁 select for update实现秒杀案例(jfinal框架)
MySQL悲观锁 select for update实现秒杀案例(jfinal框架) 发布时间:2018-08-17作者:laosun阅读(4287) 为了方便测试,博主使用最新的jfinal框架,里 ...
- mysql实现悲观锁语句_mysql悲观锁总结和实践
使用场景举例:以MySQL InnoDB为例 商品t_goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品 ...
- thinkphp5 mysql锁机制_thinkphp悲观锁机制处理高并发
问题分析 突然间被运营滴滴说某个活动的报名人数超过了限制人数,问怎么回事,我一下子还挺蒙的,我明明有在报名的操作之前设置了检查如果超过报名人数代码逻辑会抛错继续报名的呀. 然后我又打开数据库看了一下, ...
最新文章
- 关于动态规划,你想知道的都在这里了!
- nightwatchjs --Expect element to not include text
- DEDE常见问题(转)
- 在Javascript中 声明时用var与不用var的区别,== 和 ===的区别
- apache php 调优_Apache的性能优化(二)
- 转 Python爬虫入门二之爬虫基础了解
- 牛客算法周周练4 题解
- java 11:数组作为函数参数,数组做为函数返回值
- 树莓派 摄像头 php,树莓派3 之 USB摄像头安装和使用
- 如何在Ubuntu 18.04上安装Django
- vue v-if判断数组元素的值_我对Vue项目上线做的一些基本优化
- SLIC超像素分割详解(一)(二)(三)
- Pandas 基础(4) - 读/写 Excel 和 CSV 文件
- Qt Data Visualization 3D可视化
- MSP430项目设计:2020年TI杯大学生电子设计竞赛 坡道行驶电动小车(C题)循迹小车(分享项目展示视频与源码)
- 计算机网易云不能一键升级音质,网易云电脑版怎么调音效(一览网易云音效最佳调节技巧)...
- 常见的一句话muma
- 判断是否是正确的EMAIL格式
- 电脑pin码忘了登录不进系统_做好这些优化,电脑5秒开机不是梦
- java ar教程_JavaFX教程整理