什么是乐观锁,什么是悲观锁?

2023-10-29

在互联网公司面试中,很多小伙伴都被问到关于锁的理解。今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁。

彻底讲明白Java中眼花缭乱的各种并发锁https://gupaoedu-tom.blog.csdn.net/article/details/127854146

1、锁的定义

1)乐观锁

首先来看乐观锁,顾名思义,乐观锁就是持比较乐观态度的锁。就是在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断在此期间别的线程有没有更新过这个数据。

2)悲观锁

反之,悲观锁就是持悲观态度的锁。就在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿到这个数据就会阻塞直到它拿到锁。

2、如何理解锁

举个例子,有时候我们上公共厕所的时候要排队。如果你蹲马桶的时候开着门,外面有人排着队看着你。你会这么做吗?当然,如果在自己家里,有可能会这么干,这就是乐观锁。虽然,能进到房间,但是有人占着坑位,该排队还是得排队。比如数据库提供的类似于write_condition机制,Java API 并发工具包下面的原子变量类就是使用了乐观锁的CAS来实现的。

悲观锁就不同了,就相当于是进房间之后,第一件事就是把门锁上,那在门外排队等候的人不知道里面发生了什么,又着急但是又只能干等着,这就是悲观锁。比如行锁、表锁、读锁、写锁,都是在操作之前先上锁,Java API中的synchronized和ReentrantLock等独占锁都是悲观锁思想的实现。

3、锁的应用场景

根据前面对两种锁的介绍,总结一下两种锁的应用场景:

首先来看乐观锁,它适用于写少读多的情况,也就是说减少操作冲突,这样可以省去锁竞争的开销,提高系统的吞吐量。

而悲观锁呢,它适用于写多读少的情况。因为,如果还使用乐观锁的话,会经常出现操作冲突,这样会导致应用层会不断地Retry,反而会降低系统性能。

说了这么多,小伙伴们思考一下,你认为秒杀场景下,并发下单和支付应该使用什么锁?

彻底讲明白Java中眼花缭乱的各种并发锁https://gupaoedu-tom.blog.csdn.net/article/details/127854146

我是被编程耽误的文艺Tom,关注我,面试不再难!

最后, 6/7/8月份资料文档已整理,包含如下↓(还在持续更新中!):

100道最新大厂经典面试题解析资料文档!

15万+字Java面试题解析和配套答案!

③从应届生到高级开发都适用的简历模板!

④从入门到精通的程序员学习路线图!

完整版面试资料和答案以及PDF文档 :


扫描下方名片领取!
↓     ↓     ↓

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是乐观锁,什么是悲观锁? 的相关文章

  • 初始向量(IV)的CTR模式使用

    据我所知 CTR 模式不使用初始向量 它只需要一个计数器 用给定的密钥对其进行加密 然后将结果与明文进行异或以获得密文 其他分组密码模式 例如 CBC 在进行加密之前 会使用初始向量对明文进行异或 所以这是我的问题 我在 Java 中有以下
  • Java中如何动态添加charsequence[]中的数据?

    初始化的一种方法charsequence is charsequence item abc def 但我不想以这种方式初始化它 有人可以建议其他方式吗 比如我们初始化的方式string arrays 首先 修复变量声明 charsequen
  • Java泛型 - 实现像map这样的高阶函数

    我决定用 Java 编写一些常见的高阶函数 map filter reduce 等 这些函数通过泛型实现类型安全 但我在一个特定函数中遇到通配符匹配问题 为了完整起见 函子接口是这样的 The interface containing th
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • JFreeChart - 创建移动图表时出现问题

    我在我的 java 应用程序中使用 JFreeChart Problem 我想绘制一个XY面积图 whose 域轴 x 轴 当我们开始绘制数据时应该自动水平滚动 我在中看到了同样的事情时间序列图表但我不想要任何时间系列图表 我只想要滚动的
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • 属性文件中的字符串主机名:Java

    这听起来可能是一个非常简单的问题 但我无法找到解决方法 我有一个 config properties 文件 其中包含两个键值 IP 地址和端口号 我读取此配置文件以提取字符串格式的键值 但是 当我尝试使用这些值时 我无法连接到从配置文件中检
  • 有界通配符相关的编译器错误

    我想知道这段代码有什么问题 Map 但我试图说得更具体 这个问题在这个旧的 Apache 线程 ht
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • 如何在Java中通过反射调用代理(Spring AOP)上的方法?

    一个接口 public interface Manager Object read Long id 实现该接口的类 Transactional Public class ManagerImpl implements Manager Over
  • 当通过 Map.put(K, V) 添加值时,是否必须通过 Map.get(K) 返回相同的实例?

    假设您有以下代码 Map
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 找出该月第一个星期日/星期一等的日期

    我想在java中检测每个月第一周 第二周的第一个星期日 星期一的日期 我怎样才能实现它 我已经检查了 java 中的 Calendar 类和 Date 类 但无法找到解决方案 所以请帮助我解决这个问题 Calendar calendar C
  • Java“非法访问操作”方法将被弃用? [复制]

    这个问题在这里已经有答案了 JDK 9 JVM 发出非法访问操作警告后 如果您使用一些非法访问 例如setAccessible 我的问题 Is setAccessible 以后会被封吗 此功能的官方参考 如果将被弃用 在哪里 我在任何地方都
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i

随机推荐

  • OpenAI CTO、吴恩达夫人……AI 领域值得关注的「她」力量,个个都是女强人

    内容一览 她时代 来临 一些有着强大信念与热情的女性 纷纷投身至 AI 领域 成为不可或缺的存在与力量 值此国际妇女节到来之际 HyperAI超神经盘点了领域内令人印象深刻的杰出的女性代表 关键词 国际妇女节 人工智能 杰出女性 技术本无关
  • 南丁格尔玫瑰图

    1 绘制南丁格尔玫瑰图的步骤 数据准备工作 准备好角度数值和半径数值 建立画布 并将直角坐标转化为极坐标 并对极坐标进行一定的设置 使用bar函数进行绘图 对图形进行美化处理 2 上代码 import numpy as np import
  • 基于SSM的教师管理系统

    文末获取源码 项目技术栈 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用HTML和Vue相结合开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Ec
  • CocosCreater 教程(中)

    1 图形渲染 1 1 渲染管线 RenderPipeline 用于控制场景的渲染流程 包括光照管理 物体剔除 渲染物体排序 渲染目标切换等 引擎默认使用 前向渲染管线 前向渲染管线的执行流程如下图所示 1 2 相机 游戏中的相机是用来捕捉场
  • linux查看MySQL服务状态

    最近自己的博客服务器总是挂掉 虽然用的是阿里云配置比较低的 但是之前也是好好的还相对比较稳定的 感觉这套路云又在搞事情 首先要看一下MySQL服务状态 一般来说我们都会用命令交互命令mysql来 service mysql status 但
  • 《管理的套路》简述(一)

    1 SMART原则 适用于目标设定 任务委派 Specific 具体明确的 Measurable 可衡量的 Achievable or Attainable 可达成的 Relevant or Realistic 相关的或现实的 Time l
  • 《AI秘籍》预告

    Hi 大家好 我是茶桁 这里为自己做个广告 目前打算开始写一整个系列 AI秘籍 这一段时间内我写过一个系列 零基础学习大语言模型 目前还没写完 说实话 这个系列其实原出处并不是我 严谨的说来 有涉嫌擦边 洗稿 的嫌疑 所以最后放弃了收费的想
  • Shiro面试必问

    Shiro的优点 简单的身份认证 支持多种数据源 对角色的简单的授权 支持细粒度的授权 方法级 支持一级缓存 以提升应用程序的性能 内置的基于 POJO 企业会话管理 适用于 Web 以及非 Web 的环境 非常简单的加密 API 不跟任何
  • Sass 基础教程——安装

    本篇主要如何安装 Sass 并不需要 CSS 知识 不过对 CSS 不熟悉的同学可参考我之前写的系列教程 CSS入门篇 CSS进阶篇 CSS高级篇 上一篇我们提到过 Sass 是一种 CSS 的扩展语言 也是一种脚本语言 需要转换成 CSS
  • MyBatis-Plus学习笔记

    一 MyBatis Plus 1 简介 MyBatis Plus opens new window 简称 MP 是一个 MyBatis opens new window 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发
  • 【Python】群体智能算法优化支持向量机

    Python 群体智能算法优化支持向量机 本文主要介绍了基于流行智能算法Grey Wolf Optimizer GWO 来优化支持向量机模型的代码 from sklearn svm import SVR import pandas as p
  • 解决 TypeError: 'NoneType' object has no attribute '__getitem__'

    其实这个问题的出现一般是某个变量是空 也就是 NoneType 类型导致的 大致按照这个方向排错即可解决 最近在处理一个图片问题的时候 大致写的代码是把某个路径下面的图片找到 读到内存里面 在依据x1 y1 x2 y2四个坐标值把图片的RO
  • 一个优秀的C#开源绘图软件 DrawTools

    1 Extensions to DrawTools Author Mark Miller I develop software for a leading healthcare system in Northern Illinois Dow
  • jfrog artifactory 的使用

    jfrog artifactory 使用 Artifactory 仓库类型 Artifactory 仓库主要有四种类型 远程仓库 本地仓库 虚拟仓库及分发仓库 分别应用在如下不同的场景 远程仓库 Artifactory 仓库支持代理公网或内
  • WebPlusPro平台之(7)轮播图的导入和制作

    轮播图 WebPlusPro之轮播图 1 定义 2 使用方法 2 1 方法一 2 2 方法二 2 2 1 解决方法一 治标又治本 2 2 2 解决方法二 方便又快捷 2 2 3 解决方法三 前沿又美观 3 结语 WebPlusPro之轮播图
  • thymeleaf基本使用

    简介 thymeleaf是用来代替jsp的模板引擎 可以用th 表达式从后台获取数据 基本语法 th text 用来渲染一个文本 div request设置的msg值 div div session设置的msg div div applic
  • git深入理解(六):git checkout详解

    Switch branches or restore working tree files git checkout h usage git checkout
  • SpringMVC从入门到精通

    一 SpringMVC基础入门 创建一个HelloWorld程序 1 首先 导入SpringMVC需要的jar包 2 添加Web xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 7 8 9
  • Redis里的key过期了,为什么内存没有释放

    1 Redis过期策略定期删除和惰性删除 定期删除 Redis会每隔一段时间执行一次定期删除 但并不保证所有过期的key会被立即清理掉 惰性删除 当一个key被访问时 Redis会监测key是否过期 过期则删除并释放相应内存空间 2 解答
  • 什么是乐观锁,什么是悲观锁?

    在互联网公司面试中 很多小伙伴都被问到关于锁的理解 今天 我给小伙伴们来聊一聊我对锁的理解 不管我们互斥锁 自旋锁 重入锁 读写锁 行锁 表锁等等等等这些概念 我把他们都归纳为两种类型 乐观锁和悲观锁 彻底讲明白Java中眼花缭乱的各种并发